grpc 1.46.3 → 1.53.1

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

Potentially problematic release.


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

Files changed (1803) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +419 -241
  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/endpoint_config.h +11 -5
  7. data/include/grpc/event_engine/event_engine.h +129 -39
  8. data/include/grpc/event_engine/internal/memory_allocator_impl.h +1 -1
  9. data/include/grpc/event_engine/internal/slice_cast.h +67 -0
  10. data/include/grpc/event_engine/memory_allocator.h +1 -16
  11. data/include/grpc/event_engine/port.h +1 -1
  12. data/include/grpc/event_engine/slice.h +306 -0
  13. data/include/grpc/event_engine/slice_buffer.h +159 -0
  14. data/include/grpc/fork.h +25 -1
  15. data/include/grpc/grpc.h +4 -14
  16. data/include/grpc/grpc_posix.h +1 -1
  17. data/include/grpc/grpc_security.h +11 -0
  18. data/include/grpc/impl/codegen/atm.h +3 -71
  19. data/include/grpc/impl/codegen/atm_gcc_atomic.h +3 -67
  20. data/include/grpc/impl/codegen/atm_gcc_sync.h +3 -61
  21. data/include/grpc/impl/codegen/atm_windows.h +3 -108
  22. data/include/grpc/impl/codegen/byte_buffer.h +4 -78
  23. data/include/grpc/impl/codegen/byte_buffer_reader.h +4 -19
  24. data/include/grpc/impl/codegen/compression_types.h +5 -83
  25. data/include/grpc/impl/codegen/connectivity_state.h +5 -21
  26. data/include/grpc/impl/codegen/fork.h +4 -25
  27. data/include/grpc/impl/codegen/gpr_types.h +4 -35
  28. data/include/grpc/impl/codegen/grpc_types.h +5 -791
  29. data/include/grpc/impl/codegen/log.h +3 -86
  30. data/include/grpc/impl/codegen/port_platform.h +3 -699
  31. data/include/grpc/impl/codegen/propagation_bits.h +3 -28
  32. data/include/grpc/impl/codegen/slice.h +4 -107
  33. data/include/grpc/impl/codegen/status.h +4 -131
  34. data/include/grpc/impl/codegen/sync.h +3 -42
  35. data/include/grpc/impl/codegen/sync_abseil.h +3 -12
  36. data/include/grpc/impl/codegen/sync_custom.h +3 -14
  37. data/include/grpc/impl/codegen/sync_generic.h +3 -25
  38. data/include/grpc/impl/codegen/sync_posix.h +3 -28
  39. data/include/grpc/impl/codegen/sync_windows.h +3 -16
  40. data/include/grpc/impl/compression_types.h +109 -0
  41. data/include/grpc/impl/connectivity_state.h +47 -0
  42. data/include/grpc/impl/grpc_types.h +836 -0
  43. data/include/grpc/impl/propagation_bits.h +54 -0
  44. data/include/grpc/impl/slice_type.h +112 -0
  45. data/include/grpc/load_reporting.h +1 -1
  46. data/include/grpc/module.modulemap +5 -1
  47. data/include/grpc/slice.h +1 -1
  48. data/include/grpc/status.h +131 -1
  49. data/include/grpc/support/atm.h +70 -1
  50. data/include/grpc/support/atm_gcc_atomic.h +59 -1
  51. data/include/grpc/support/atm_gcc_sync.h +58 -1
  52. data/include/grpc/support/atm_windows.h +105 -1
  53. data/include/grpc/support/log.h +87 -1
  54. data/include/grpc/support/log_windows.h +1 -1
  55. data/include/grpc/support/port_platform.h +767 -1
  56. data/include/grpc/support/string_util.h +1 -1
  57. data/include/grpc/support/sync.h +35 -2
  58. data/include/grpc/support/sync_abseil.h +11 -1
  59. data/include/grpc/support/sync_custom.h +13 -1
  60. data/include/grpc/support/sync_generic.h +24 -1
  61. data/include/grpc/support/sync_posix.h +27 -1
  62. data/include/grpc/support/sync_windows.h +15 -1
  63. data/include/grpc/support/time.h +31 -6
  64. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +148 -0
  65. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +52 -0
  66. data/src/core/ext/filters/backend_metrics/backend_metric_provider.h +29 -0
  67. data/src/core/ext/filters/census/grpc_context.cc +19 -17
  68. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +67 -61
  69. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +26 -6
  70. data/src/core/ext/filters/channel_idle/idle_filter_state.h +6 -4
  71. data/src/core/ext/filters/client_channel/backend_metric.cc +19 -12
  72. data/src/core/ext/filters/client_channel/backend_metric.h +21 -11
  73. data/src/core/ext/filters/client_channel/backup_poller.cc +34 -34
  74. data/src/core/ext/filters/client_channel/backup_poller.h +26 -28
  75. data/src/core/ext/filters/client_channel/channel_connectivity.cc +89 -44
  76. data/src/core/ext/filters/client_channel/client_channel.cc +401 -451
  77. data/src/core/ext/filters/client_channel/client_channel.h +68 -26
  78. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +19 -23
  79. data/src/core/ext/filters/client_channel/client_channel_channelz.h +33 -23
  80. data/src/core/ext/filters/client_channel/client_channel_factory.cc +19 -43
  81. data/src/core/ext/filters/client_channel/client_channel_factory.h +11 -11
  82. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +22 -47
  83. data/src/core/ext/filters/client_channel/client_channel_service_config.cc +153 -0
  84. data/src/core/ext/filters/client_channel/{resolver_result_parsing.h → client_channel_service_config.h} +33 -27
  85. data/src/core/ext/filters/client_channel/config_selector.cc +1 -0
  86. data/src/core/ext/filters/client_channel/config_selector.h +29 -23
  87. data/src/core/ext/filters/client_channel/connector.h +19 -10
  88. data/src/core/ext/filters/client_channel/dynamic_filters.cc +40 -54
  89. data/src/core/ext/filters/client_channel/dynamic_filters.h +20 -11
  90. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +2 -0
  91. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +24 -21
  92. data/src/core/ext/filters/client_channel/health/health_check_client.cc +16 -4
  93. data/src/core/ext/filters/client_channel/health/health_check_client.h +5 -3
  94. data/src/core/ext/filters/client_channel/http_proxy.cc +100 -112
  95. data/src/core/ext/filters/client_channel/http_proxy.h +38 -31
  96. data/src/core/ext/filters/client_channel/lb_call_state_internal.h +39 -0
  97. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +8 -5
  98. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +4 -3
  99. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +49 -0
  100. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +37 -16
  101. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +18 -13
  102. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +71 -131
  103. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +41 -24
  104. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +410 -375
  105. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +26 -27
  106. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +15 -3
  107. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +9 -7
  108. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +18 -20
  109. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +27 -22
  110. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +28 -19
  111. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +26 -25
  112. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +338 -0
  113. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +57 -0
  114. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric_internal.h +117 -0
  115. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +1129 -0
  116. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +94 -0
  117. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +174 -180
  118. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +366 -407
  119. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +491 -405
  120. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +19 -9
  121. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +619 -634
  122. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +261 -234
  123. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +165 -143
  124. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/static_stride_scheduler.cc +128 -0
  125. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/static_stride_scheduler.h +71 -0
  126. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +972 -0
  127. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +223 -220
  128. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +214 -153
  129. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +42 -0
  130. data/src/core/ext/filters/client_channel/lb_policy/xds/{xds.h → xds_attributes.h} +19 -15
  131. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +3 -3
  132. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +178 -256
  133. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +199 -210
  134. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +382 -368
  135. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +819 -0
  136. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +67 -0
  137. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +369 -0
  138. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +4 -0
  139. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +22 -21
  140. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +34 -19
  141. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +531 -163
  142. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +50 -44
  143. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +31 -30
  144. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +89 -84
  145. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +300 -209
  146. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +82 -61
  147. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc +18 -18
  148. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +20 -19
  149. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +2 -0
  150. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +22 -22
  151. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +54 -22
  152. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +21 -34
  153. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +19 -5
  154. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +135 -63
  155. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +136 -68
  156. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +29 -14
  157. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +21 -27
  158. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +368 -305
  159. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +6 -4
  160. data/src/core/ext/filters/client_channel/retry_filter.cc +166 -163
  161. data/src/core/ext/filters/client_channel/retry_filter.h +4 -3
  162. data/src/core/ext/filters/client_channel/retry_service_config.cc +197 -229
  163. data/src/core/ext/filters/client_channel/retry_service_config.h +29 -26
  164. data/src/core/ext/filters/client_channel/retry_throttle.cc +28 -37
  165. data/src/core/ext/filters/client_channel/retry_throttle.h +36 -29
  166. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +34 -17
  167. data/src/core/ext/filters/client_channel/subchannel.cc +332 -384
  168. data/src/core/ext/filters/client_channel/subchannel.h +112 -82
  169. data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +38 -0
  170. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +17 -77
  171. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +41 -47
  172. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +34 -108
  173. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +20 -12
  174. data/src/core/ext/filters/deadline/deadline_filter.cc +94 -76
  175. data/src/core/ext/filters/deadline/deadline_filter.h +14 -12
  176. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +44 -22
  177. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +20 -11
  178. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc +118 -0
  179. data/src/core/ext/filters/fault_injection/{service_config_parser.h → fault_injection_service_config_parser.h} +34 -13
  180. data/src/core/ext/filters/http/client/http_client_filter.cc +76 -54
  181. data/src/core/ext/filters/http/client/http_client_filter.h +36 -23
  182. data/src/core/ext/filters/http/client_authority_filter.cc +33 -38
  183. data/src/core/ext/filters/http/client_authority_filter.h +27 -24
  184. data/src/core/ext/filters/http/http_filters_plugin.cc +46 -55
  185. data/src/core/ext/filters/http/message_compress/compression_filter.cc +307 -0
  186. data/src/core/ext/filters/http/message_compress/compression_filter.h +139 -0
  187. data/src/core/ext/filters/http/server/http_server_filter.cc +111 -271
  188. data/src/core/ext/filters/http/server/http_server_filter.h +58 -24
  189. data/src/core/ext/filters/message_size/message_size_filter.cc +117 -137
  190. data/src/core/ext/filters/message_size/message_size_filter.h +34 -17
  191. data/src/core/ext/filters/rbac/rbac_filter.cc +29 -16
  192. data/src/core/ext/filters/rbac/rbac_filter.h +11 -3
  193. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +736 -523
  194. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +18 -7
  195. data/src/core/ext/filters/server_config_selector/server_config_selector.h +20 -8
  196. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +28 -12
  197. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +4 -3
  198. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +219 -0
  199. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +66 -0
  200. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.cc +82 -0
  201. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +93 -0
  202. data/src/core/ext/transport/chttp2/alpn/alpn.cc +18 -18
  203. data/src/core/ext/transport/chttp2/alpn/alpn.h +24 -24
  204. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +185 -241
  205. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +38 -30
  206. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +204 -211
  207. data/src/core/ext/transport/chttp2/server/chttp2_server.h +26 -26
  208. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +24 -24
  209. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +35 -34
  210. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +43 -38
  211. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +35 -31
  212. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +801 -1067
  213. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +28 -23
  214. data/src/core/ext/transport/chttp2/transport/context_list.cc +23 -19
  215. data/src/core/ext/transport/chttp2/transport/context_list.h +32 -29
  216. data/src/core/ext/transport/chttp2/transport/decode_huff.cc +251 -0
  217. data/src/core/ext/transport/chttp2/transport/decode_huff.h +971 -0
  218. data/src/core/ext/transport/chttp2/transport/flow_control.cc +350 -300
  219. data/src/core/ext/transport/chttp2/transport/flow_control.h +248 -325
  220. data/src/core/ext/transport/chttp2/transport/frame.h +22 -26
  221. data/src/core/ext/transport/chttp2/transport/frame_data.cc +85 -234
  222. data/src/core/ext/transport/chttp2/transport/frame_data.h +38 -61
  223. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +41 -36
  224. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +24 -22
  225. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +31 -25
  226. data/src/core/ext/transport/chttp2/transport/frame_ping.h +25 -22
  227. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +35 -26
  228. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +24 -21
  229. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +44 -77
  230. data/src/core/ext/transport/chttp2/transport/frame_settings.h +27 -23
  231. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +34 -33
  232. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +24 -21
  233. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +10 -4
  234. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +221 -372
  235. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +338 -158
  236. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +6 -1
  237. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +16 -5
  238. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +516 -751
  239. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +38 -27
  240. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +86 -76
  241. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +79 -49
  242. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +21 -19
  243. data/src/core/ext/transport/chttp2/transport/http2_settings.h +39 -38
  244. data/src/core/ext/transport/chttp2/transport/http_trace.cc +19 -0
  245. data/src/core/ext/transport/chttp2/transport/http_trace.h +24 -0
  246. data/src/core/ext/transport/chttp2/transport/huffsyms.cc +20 -20
  247. data/src/core/ext/transport/chttp2/transport/huffsyms.h +21 -21
  248. data/src/core/ext/transport/chttp2/transport/internal.h +248 -296
  249. data/src/core/ext/transport/chttp2/transport/parsing.cc +363 -132
  250. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +30 -30
  251. data/src/core/ext/transport/chttp2/transport/stream_map.cc +24 -24
  252. data/src/core/ext/transport/chttp2/transport/stream_map.h +34 -33
  253. data/src/core/ext/transport/chttp2/transport/varint.cc +19 -20
  254. data/src/core/ext/transport/chttp2/transport/varint.h +39 -34
  255. data/src/core/ext/transport/chttp2/transport/writing.cc +121 -94
  256. data/src/core/ext/transport/inproc/inproc_plugin.cc +17 -18
  257. data/src/core/ext/transport/inproc/inproc_transport.cc +227 -274
  258. data/src/core/ext/transport/inproc/inproc_transport.h +23 -21
  259. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.c +5 -5
  260. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.h +30 -10
  261. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.c +6 -5
  262. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.h +33 -8
  263. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +8 -327
  264. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +83 -1723
  265. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.c +388 -0
  266. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.h +1953 -0
  267. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.c +2 -2
  268. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.h +12 -4
  269. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.c +6 -4
  270. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.h +33 -4
  271. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.c +1 -1
  272. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.h +6 -2
  273. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.c +1 -1
  274. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.h +6 -2
  275. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.h +6 -2
  276. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.h +12 -4
  277. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.c +1 -1
  278. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.h +6 -2
  279. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +1 -1
  280. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -3
  281. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +14 -14
  282. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +90 -30
  283. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +25 -19
  284. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +168 -34
  285. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +3 -3
  286. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +18 -6
  287. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +35 -43
  288. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +195 -116
  289. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +1 -1
  290. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +6 -2
  291. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +1 -1
  292. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +6 -2
  293. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.c +11 -11
  294. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.h +84 -28
  295. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +35 -12
  296. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +179 -14
  297. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +1 -1
  298. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +6 -2
  299. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +25 -23
  300. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +156 -48
  301. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +7 -7
  302. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +42 -14
  303. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +1 -1
  304. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +6 -2
  305. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +1 -1
  306. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +6 -2
  307. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.c +2 -2
  308. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.h +12 -4
  309. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +12 -12
  310. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +78 -26
  311. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +23 -20
  312. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +137 -69
  313. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +1 -1
  314. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +6 -2
  315. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +23 -21
  316. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +132 -44
  317. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +1 -1
  318. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +6 -2
  319. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +2 -2
  320. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +12 -4
  321. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +17 -2
  322. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +67 -2
  323. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +1 -1
  324. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +6 -2
  325. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +1 -1
  326. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +6 -2
  327. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +3 -3
  328. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +18 -6
  329. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +15 -9
  330. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +73 -18
  331. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +3 -3
  332. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +30 -10
  333. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +1 -1
  334. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +6 -2
  335. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +39 -13
  336. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +194 -15
  337. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +5 -5
  338. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +42 -14
  339. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +5 -3
  340. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +28 -2
  341. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +7 -4
  342. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +36 -4
  343. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c +1 -1
  344. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.h +6 -2
  345. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +6 -6
  346. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +48 -16
  347. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +8 -8
  348. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +54 -18
  349. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +26 -11
  350. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +124 -14
  351. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +19 -15
  352. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +78 -69
  353. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +168 -82
  354. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +887 -166
  355. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +3 -3
  356. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +18 -6
  357. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.c +34 -15
  358. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.h +161 -22
  359. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.c +3 -2
  360. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.h +15 -2
  361. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.c +1 -1
  362. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.h +6 -2
  363. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +2 -2
  364. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +12 -4
  365. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.c +1 -1
  366. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.h +6 -2
  367. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.c +1 -1
  368. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.h +6 -2
  369. data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.c +47 -0
  370. data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.h +107 -0
  371. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.c +1 -1
  372. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.h +6 -2
  373. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.c +2 -2
  374. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.h +12 -4
  375. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.c +1 -0
  376. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.h +1 -0
  377. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.c +2 -2
  378. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.h +12 -4
  379. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.c +7 -6
  380. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.h +27 -14
  381. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +1 -1
  382. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +6 -2
  383. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +2 -2
  384. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +30 -10
  385. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +2 -2
  386. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +18 -6
  387. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +11 -4
  388. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +58 -4
  389. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +6 -3
  390. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +29 -2
  391. data/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.c +62 -0
  392. data/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h +179 -0
  393. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +38 -27
  394. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +207 -52
  395. data/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.c +46 -0
  396. data/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.h +98 -0
  397. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.c +54 -0
  398. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.h +188 -0
  399. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/common/v3/common.upb.c +111 -0
  400. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/common/v3/common.upb.h +444 -0
  401. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +56 -0
  402. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +192 -0
  403. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +46 -0
  404. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +98 -0
  405. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +10 -8
  406. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +66 -14
  407. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +3 -3
  408. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +18 -6
  409. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +13 -11
  410. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +73 -23
  411. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.c +2 -2
  412. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.h +12 -4
  413. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
  414. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +6 -2
  415. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +133 -16
  416. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +656 -12
  417. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +2 -2
  418. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +12 -4
  419. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +5 -5
  420. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +30 -10
  421. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.c +1 -1
  422. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.h +6 -2
  423. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +4 -4
  424. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +24 -8
  425. data/src/core/ext/upb-generated/envoy/type/matcher/v3/filter_state.upb.c +47 -0
  426. data/src/core/ext/upb-generated/envoy/type/matcher/v3/filter_state.upb.h +113 -0
  427. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c +4 -4
  428. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.h +24 -8
  429. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +2 -2
  430. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +12 -4
  431. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +1 -1
  432. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +6 -2
  433. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +1 -1
  434. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +6 -2
  435. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +1 -1
  436. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +6 -2
  437. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +3 -3
  438. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +18 -6
  439. data/src/core/ext/upb-generated/envoy/type/matcher/v3/status_code_input.upb.c +43 -0
  440. data/src/core/ext/upb-generated/envoy/type/matcher/v3/status_code_input.upb.h +114 -0
  441. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +1 -1
  442. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +12 -4
  443. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +2 -2
  444. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +12 -4
  445. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +3 -3
  446. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +18 -6
  447. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +7 -7
  448. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +42 -14
  449. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +5 -5
  450. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +30 -10
  451. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.c +3 -3
  452. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.h +18 -6
  453. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.c +1 -1
  454. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.h +6 -2
  455. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +12 -4
  456. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +2 -2
  457. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +18 -6
  458. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.c +63 -0
  459. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.h +202 -0
  460. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_unit.upb.h +3 -1
  461. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +1 -1
  462. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +6 -2
  463. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.h +6 -2
  464. data/src/core/ext/upb-generated/google/api/annotations.upb.h +1 -1
  465. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +11 -11
  466. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +66 -22
  467. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +9 -9
  468. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +72 -24
  469. data/src/core/ext/upb-generated/google/api/http.upb.c +3 -3
  470. data/src/core/ext/upb-generated/google/api/http.upb.h +18 -6
  471. data/src/core/ext/upb-generated/google/api/httpbody.upb.c +1 -1
  472. data/src/core/ext/upb-generated/google/api/httpbody.upb.h +6 -2
  473. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +1 -1
  474. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +6 -2
  475. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +44 -43
  476. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +177 -55
  477. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +1 -1
  478. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +6 -2
  479. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
  480. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +6 -2
  481. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +2 -2
  482. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +18 -6
  483. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +1 -1
  484. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +6 -2
  485. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +6 -6
  486. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +54 -18
  487. data/src/core/ext/upb-generated/google/rpc/status.upb.c +1 -1
  488. data/src/core/ext/upb-generated/google/rpc/status.upb.h +6 -2
  489. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.c +2 -2
  490. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.h +24 -8
  491. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +6 -2
  492. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +7 -7
  493. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +60 -20
  494. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +1 -1
  495. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +12 -4
  496. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +2 -2
  497. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +12 -4
  498. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +6 -6
  499. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +54 -18
  500. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +2 -2
  501. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +12 -4
  502. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c +7 -7
  503. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h +42 -14
  504. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +3 -3
  505. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +23 -11
  506. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +1 -1
  507. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +7 -3
  508. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +7 -3
  509. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +1 -1
  510. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -3
  511. data/src/core/ext/upb-generated/validate/validate.upb.c +22 -22
  512. data/src/core/ext/upb-generated/validate/validate.upb.h +139 -47
  513. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.c +3 -3
  514. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.h +23 -11
  515. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.c +1 -1
  516. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.h +7 -3
  517. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +3 -3
  518. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +27 -11
  519. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.c +1 -1
  520. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.h +7 -3
  521. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +1 -1
  522. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +6 -2
  523. data/src/core/ext/upb-generated/xds/core/v3/cidr.upb.c +47 -0
  524. data/src/core/ext/upb-generated/xds/core/v3/cidr.upb.h +107 -0
  525. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +2 -2
  526. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +12 -4
  527. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +1 -1
  528. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +6 -2
  529. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.c +1 -1
  530. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.h +6 -2
  531. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +1 -1
  532. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +6 -2
  533. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +1 -1
  534. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +12 -4
  535. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +1 -1
  536. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +6 -2
  537. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +3 -2
  538. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +15 -2
  539. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +46 -0
  540. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.h +113 -0
  541. data/src/core/ext/upb-generated/xds/type/matcher/v3/cel.upb.c +46 -0
  542. data/src/core/ext/upb-generated/xds/type/matcher/v3/cel.upb.h +98 -0
  543. data/src/core/ext/upb-generated/xds/type/matcher/v3/domain.upb.c +62 -0
  544. data/src/core/ext/upb-generated/xds/type/matcher/v3/domain.upb.h +174 -0
  545. data/src/core/ext/upb-generated/xds/type/matcher/v3/http_inputs.upb.c +36 -0
  546. data/src/core/ext/upb-generated/xds/type/matcher/v3/http_inputs.upb.h +74 -0
  547. data/src/core/ext/upb-generated/xds/type/matcher/v3/ip.upb.c +65 -0
  548. data/src/core/ext/upb-generated/xds/type/matcher/v3/ip.upb.h +191 -0
  549. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.c +6 -6
  550. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.h +54 -18
  551. data/src/core/ext/upb-generated/xds/type/matcher/v3/range.upb.c +127 -0
  552. data/src/core/ext/upb-generated/xds/type/matcher/v3/range.upb.h +474 -0
  553. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.c +2 -2
  554. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.h +12 -4
  555. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.c +1 -1
  556. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.h +12 -4
  557. data/src/core/ext/upb-generated/xds/type/v3/cel.upb.c +67 -0
  558. data/src/core/ext/upb-generated/xds/type/v3/cel.upb.h +214 -0
  559. data/src/core/ext/upb-generated/xds/type/v3/range.upb.c +64 -0
  560. data/src/core/ext/upb-generated/xds/type/v3/range.upb.h +208 -0
  561. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +1 -2
  562. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +6 -2
  563. data/src/core/ext/upbdefs-generated/envoy/admin/v3/clusters.upbdefs.c +54 -53
  564. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +67 -274
  565. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +0 -85
  566. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.c +277 -0
  567. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.h +125 -0
  568. data/src/core/ext/upbdefs-generated/envoy/admin/v3/listeners.upbdefs.c +14 -11
  569. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +107 -107
  570. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +199 -187
  571. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +232 -222
  572. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +0 -5
  573. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +95 -75
  574. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h +5 -0
  575. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +187 -183
  576. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +81 -75
  577. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +190 -186
  578. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +7 -3
  579. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h +5 -0
  580. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +16 -16
  581. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +71 -66
  582. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +164 -137
  583. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +5 -0
  584. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +16 -12
  585. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +39 -31
  586. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +140 -129
  587. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +5 -0
  588. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +82 -74
  589. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +2 -2
  590. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +740 -667
  591. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +20 -0
  592. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.c +150 -139
  593. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.h +5 -0
  594. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/datadog.upbdefs.c +16 -14
  595. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.c +48 -0
  596. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.h +35 -0
  597. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/trace.upbdefs.c +16 -12
  598. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/zipkin.upbdefs.c +20 -18
  599. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +46 -25
  600. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +53 -42
  601. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c +60 -0
  602. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.h +40 -0
  603. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +485 -467
  604. data/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c +50 -0
  605. data/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.h +35 -0
  606. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +21 -18
  607. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +149 -145
  608. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +156 -84
  609. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +35 -0
  610. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +113 -113
  611. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/filter_state.upbdefs.c +48 -0
  612. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/filter_state.upbdefs.h +35 -0
  613. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +29 -28
  614. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/status_code_input.upbdefs.c +40 -0
  615. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/status_code_input.upbdefs.h +40 -0
  616. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.c +69 -0
  617. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.h +40 -0
  618. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_unit.upbdefs.c +10 -9
  619. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +92 -90
  620. data/src/core/ext/upbdefs-generated/xds/core/v3/cidr.upbdefs.c +45 -0
  621. data/src/core/ext/upbdefs-generated/xds/core/v3/cidr.upbdefs.h +35 -0
  622. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/cel.upbdefs.c +43 -0
  623. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/cel.upbdefs.h +35 -0
  624. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/domain.upbdefs.c +51 -0
  625. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/domain.upbdefs.h +40 -0
  626. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/http_inputs.upbdefs.c +36 -0
  627. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/http_inputs.upbdefs.h +35 -0
  628. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/ip.upbdefs.c +55 -0
  629. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/ip.upbdefs.h +40 -0
  630. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/matcher.upbdefs.c +9 -9
  631. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/range.upbdefs.c +71 -0
  632. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/range.upbdefs.h +60 -0
  633. data/src/core/ext/upbdefs-generated/xds/type/v3/cel.upbdefs.c +60 -0
  634. data/src/core/ext/upbdefs-generated/xds/type/v3/cel.upbdefs.h +40 -0
  635. data/src/core/ext/upbdefs-generated/xds/type/v3/range.upbdefs.c +36 -0
  636. data/src/core/ext/upbdefs-generated/xds/type/v3/range.upbdefs.h +45 -0
  637. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +4 -7
  638. data/src/core/ext/xds/certificate_provider_store.cc +69 -5
  639. data/src/core/ext/xds/certificate_provider_store.h +22 -5
  640. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +17 -10
  641. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +12 -4
  642. data/src/core/ext/xds/upb_utils.h +3 -25
  643. data/src/core/ext/xds/xds_api.cc +90 -196
  644. data/src/core/ext/xds/xds_api.h +41 -39
  645. data/src/core/ext/xds/xds_bootstrap.cc +5 -537
  646. data/src/core/ext/xds/xds_bootstrap.h +41 -96
  647. data/src/core/ext/xds/xds_bootstrap_grpc.cc +362 -0
  648. data/src/core/ext/xds/xds_bootstrap_grpc.h +184 -0
  649. data/src/core/ext/xds/xds_certificate_provider.cc +35 -26
  650. data/src/core/ext/xds/xds_certificate_provider.h +29 -5
  651. data/src/core/ext/xds/xds_channel_args.h +3 -3
  652. data/src/core/ext/xds/xds_channel_stack_modifier.cc +17 -7
  653. data/src/core/ext/xds/xds_channel_stack_modifier.h +16 -4
  654. data/src/core/ext/xds/xds_client.cc +849 -1316
  655. data/src/core/ext/xds/xds_client.h +57 -61
  656. data/src/core/ext/xds/xds_client_grpc.cc +235 -0
  657. data/src/core/ext/xds/xds_client_grpc.h +79 -0
  658. data/src/core/ext/xds/xds_client_stats.cc +24 -25
  659. data/src/core/ext/xds/xds_client_stats.h +26 -24
  660. data/src/core/ext/xds/xds_cluster.cc +505 -247
  661. data/src/core/ext/xds/xds_cluster.h +69 -40
  662. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +67 -77
  663. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +47 -29
  664. data/src/core/ext/xds/xds_common_types.cc +238 -123
  665. data/src/core/ext/xds/xds_common_types.h +29 -16
  666. data/src/core/ext/xds/xds_endpoint.cc +265 -162
  667. data/src/core/ext/xds/xds_endpoint.h +19 -15
  668. data/src/core/ext/xds/xds_health_status.cc +80 -0
  669. data/src/core/ext/xds/xds_health_status.h +109 -0
  670. data/src/core/ext/xds/xds_http_fault_filter.cc +67 -58
  671. data/src/core/ext/xds/xds_http_fault_filter.h +19 -25
  672. data/src/core/ext/xds/xds_http_filters.cc +70 -71
  673. data/src/core/ext/xds/xds_http_filters.h +73 -25
  674. data/src/core/ext/xds/xds_http_rbac_filter.cc +168 -225
  675. data/src/core/ext/xds/xds_http_rbac_filter.h +22 -18
  676. data/src/core/ext/xds/xds_http_stateful_session_filter.cc +218 -0
  677. data/src/core/ext/xds/xds_http_stateful_session_filter.h +58 -0
  678. data/src/core/ext/xds/xds_lb_policy_registry.cc +334 -0
  679. data/src/core/ext/xds/xds_lb_policy_registry.h +71 -0
  680. data/src/core/ext/xds/xds_listener.cc +573 -481
  681. data/src/core/ext/xds/xds_listener.h +57 -51
  682. data/src/core/ext/xds/xds_resource_type.h +28 -22
  683. data/src/core/ext/xds/xds_resource_type_impl.h +18 -17
  684. data/src/core/ext/xds/xds_route_config.cc +592 -570
  685. data/src/core/ext/xds/xds_route_config.h +74 -40
  686. data/src/core/ext/xds/xds_routing.cc +21 -7
  687. data/src/core/ext/xds/xds_routing.h +17 -12
  688. data/src/core/ext/xds/xds_server_config_fetcher.cc +227 -178
  689. data/src/core/ext/xds/xds_transport.h +86 -0
  690. data/src/core/ext/xds/xds_transport_grpc.cc +356 -0
  691. data/src/core/ext/xds/xds_transport_grpc.h +135 -0
  692. data/src/core/lib/address_utils/parse_address.cc +52 -52
  693. data/src/core/lib/address_utils/parse_address.h +46 -42
  694. data/src/core/lib/address_utils/sockaddr_utils.cc +90 -54
  695. data/src/core/lib/address_utils/sockaddr_utils.h +45 -40
  696. data/src/core/lib/avl/avl.h +57 -33
  697. data/src/core/lib/backoff/backoff.cc +19 -21
  698. data/src/core/lib/backoff/backoff.h +21 -21
  699. data/src/core/lib/backoff/random_early_detection.cc +31 -0
  700. data/src/core/lib/backoff/random_early_detection.h +59 -0
  701. data/src/core/lib/channel/call_finalization.h +6 -4
  702. data/src/core/lib/channel/call_tracer.h +23 -8
  703. data/src/core/lib/channel/channel_args.cc +149 -61
  704. data/src/core/lib/channel/channel_args.h +308 -104
  705. data/src/core/lib/channel/channel_args_preconditioning.cc +4 -3
  706. data/src/core/lib/channel/channel_args_preconditioning.h +6 -5
  707. data/src/core/lib/channel/channel_fwd.h +26 -0
  708. data/src/core/lib/channel/channel_stack.cc +92 -52
  709. data/src/core/lib/channel/channel_stack.h +184 -135
  710. data/src/core/lib/channel/channel_stack_builder.cc +26 -39
  711. data/src/core/lib/channel/channel_stack_builder.h +33 -40
  712. data/src/core/lib/channel/channel_stack_builder_impl.cc +84 -60
  713. data/src/core/lib/channel/channel_stack_builder_impl.h +9 -9
  714. data/src/core/lib/channel/channel_trace.cc +29 -36
  715. data/src/core/lib/channel/channel_trace.h +27 -24
  716. data/src/core/lib/channel/channelz.cc +50 -65
  717. data/src/core/lib/channel/channelz.h +50 -33
  718. data/src/core/lib/channel/channelz_registry.cc +28 -36
  719. data/src/core/lib/channel/channelz_registry.h +31 -30
  720. data/src/core/lib/channel/connected_channel.cc +1267 -78
  721. data/src/core/lib/channel/connected_channel.h +21 -23
  722. data/src/core/lib/channel/context.h +25 -21
  723. data/src/core/lib/channel/promise_based_filter.cc +1896 -377
  724. data/src/core/lib/channel/promise_based_filter.h +592 -92
  725. data/src/core/lib/channel/status_util.cc +64 -17
  726. data/src/core/lib/channel/status_util.h +38 -24
  727. data/src/core/lib/compression/compression.cc +24 -19
  728. data/src/core/lib/compression/compression_internal.cc +88 -63
  729. data/src/core/lib/compression/compression_internal.h +28 -27
  730. data/src/core/lib/compression/message_compress.cc +28 -26
  731. data/src/core/lib/compression/message_compress.h +28 -29
  732. data/src/core/lib/config/core_configuration.cc +8 -1
  733. data/src/core/lib/config/core_configuration.h +86 -39
  734. data/src/core/lib/debug/event_log.cc +88 -0
  735. data/src/core/lib/debug/event_log.h +81 -0
  736. data/src/core/lib/debug/histogram_view.cc +69 -0
  737. data/src/core/lib/debug/histogram_view.h +37 -0
  738. data/src/core/lib/debug/stats.cc +48 -152
  739. data/src/core/lib/debug/stats.h +50 -57
  740. data/src/core/lib/debug/stats_data.cc +302 -645
  741. data/src/core/lib/debug/stats_data.h +293 -545
  742. data/src/core/lib/debug/trace.cc +18 -20
  743. data/src/core/lib/debug/trace.h +27 -48
  744. data/src/core/lib/event_engine/channel_args_endpoint_config.cc +16 -17
  745. data/src/core/lib/event_engine/channel_args_endpoint_config.h +16 -9
  746. data/src/core/lib/event_engine/common_closures.h +71 -0
  747. data/src/core/lib/event_engine/default_event_engine.cc +99 -0
  748. data/src/core/lib/event_engine/default_event_engine.h +73 -0
  749. data/src/core/lib/event_engine/default_event_engine_factory.cc +24 -3
  750. data/src/core/lib/event_engine/{event_engine_factory.h → default_event_engine_factory.h} +6 -9
  751. data/src/core/lib/event_engine/event_engine.cc +3 -30
  752. data/src/core/lib/event_engine/executor/executor.h +38 -0
  753. data/src/core/lib/event_engine/forkable.cc +106 -0
  754. data/src/core/lib/event_engine/forkable.h +61 -0
  755. data/src/core/lib/event_engine/handle_containers.h +74 -0
  756. data/src/core/lib/event_engine/memory_allocator.cc +11 -3
  757. data/src/core/lib/event_engine/poller.h +62 -0
  758. data/src/core/lib/event_engine/posix.h +158 -0
  759. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +642 -0
  760. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +139 -0
  761. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +899 -0
  762. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +97 -0
  763. data/src/core/lib/event_engine/posix_engine/event_poller.h +111 -0
  764. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +74 -0
  765. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.h +33 -0
  766. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +77 -0
  767. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +179 -0
  768. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +265 -0
  769. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +73 -0
  770. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1305 -0
  771. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +717 -0
  772. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +640 -0
  773. data/src/core/lib/event_engine/posix_engine/posix_engine.h +259 -0
  774. data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +80 -0
  775. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +289 -0
  776. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +279 -0
  777. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +379 -0
  778. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +91 -0
  779. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +853 -0
  780. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +316 -0
  781. data/src/core/lib/event_engine/posix_engine/timer.cc +311 -0
  782. data/src/core/lib/event_engine/posix_engine/timer.h +194 -0
  783. data/src/core/lib/event_engine/posix_engine/timer_heap.cc +107 -0
  784. data/src/core/lib/event_engine/posix_engine/timer_heap.h +56 -0
  785. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +173 -0
  786. data/src/core/lib/event_engine/posix_engine/timer_manager.h +114 -0
  787. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +332 -0
  788. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +185 -0
  789. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +127 -0
  790. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +45 -0
  791. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +150 -0
  792. data/src/core/lib/{iomgr/event_engine/promise.h → event_engine/posix_engine/wakeup_fd_pipe.h} +19 -25
  793. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +76 -0
  794. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +67 -0
  795. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +37 -0
  796. data/src/core/lib/event_engine/resolved_address.cc +23 -2
  797. data/src/core/lib/{iomgr/event_engine → event_engine}/resolved_address_internal.h +5 -8
  798. data/src/core/lib/event_engine/shim.cc +56 -0
  799. data/src/core/lib/event_engine/shim.h +33 -0
  800. data/src/core/lib/event_engine/slice.cc +103 -0
  801. data/src/core/lib/event_engine/slice_buffer.cc +50 -0
  802. data/src/core/lib/event_engine/tcp_socket_utils.cc +389 -0
  803. data/src/core/lib/event_engine/tcp_socket_utils.h +90 -0
  804. data/src/core/lib/event_engine/thread_local.cc +29 -0
  805. data/src/core/lib/event_engine/thread_local.h +32 -0
  806. data/src/core/lib/event_engine/thread_pool.cc +253 -0
  807. data/src/core/lib/event_engine/thread_pool.h +141 -0
  808. data/src/core/lib/event_engine/time_util.cc +30 -0
  809. data/src/core/lib/event_engine/time_util.h +32 -0
  810. data/src/core/lib/{iomgr/endpoint_pair_event_engine.cc → event_engine/trace.cc} +9 -17
  811. data/src/core/lib/event_engine/trace.h +43 -0
  812. data/src/core/lib/event_engine/utils.cc +44 -0
  813. data/src/core/lib/event_engine/utils.h +44 -0
  814. data/src/core/lib/event_engine/windows/iocp.cc +140 -0
  815. data/src/core/lib/event_engine/windows/iocp.h +69 -0
  816. data/src/core/lib/event_engine/windows/win_socket.cc +219 -0
  817. data/src/core/lib/event_engine/windows/win_socket.h +129 -0
  818. data/src/core/lib/event_engine/windows/windows_endpoint.cc +331 -0
  819. data/src/core/lib/event_engine/windows/windows_endpoint.h +103 -0
  820. data/src/core/lib/event_engine/windows/windows_engine.cc +388 -0
  821. data/src/core/lib/event_engine/windows/windows_engine.h +163 -0
  822. data/src/core/lib/experiments/config.cc +161 -0
  823. data/src/core/lib/experiments/config.h +53 -0
  824. data/src/core/lib/experiments/experiments.cc +81 -0
  825. data/src/core/lib/experiments/experiments.h +117 -0
  826. data/src/core/lib/gpr/alloc.cc +19 -25
  827. data/src/core/lib/gpr/alloc.h +20 -20
  828. data/src/core/lib/gpr/atm.cc +17 -17
  829. data/src/core/lib/gpr/cpu_iphone.cc +24 -24
  830. data/src/core/lib/gpr/cpu_linux.cc +28 -23
  831. data/src/core/lib/gpr/cpu_posix.cc +23 -22
  832. data/src/core/lib/gpr/cpu_windows.cc +20 -18
  833. data/src/core/lib/gpr/log.cc +30 -17
  834. data/src/core/lib/gpr/log_android.cc +22 -20
  835. data/src/core/lib/gpr/log_linux.cc +24 -24
  836. data/src/core/lib/gpr/log_posix.cc +20 -19
  837. data/src/core/lib/gpr/log_windows.cc +25 -25
  838. data/src/core/lib/gpr/spinlock.h +20 -20
  839. data/src/core/lib/gpr/string.cc +25 -24
  840. data/src/core/lib/gpr/string.h +61 -61
  841. data/src/core/lib/gpr/string_posix.cc +24 -24
  842. data/src/core/lib/gpr/string_util_windows.cc +25 -52
  843. data/src/core/lib/gpr/string_windows.cc +24 -24
  844. data/src/core/lib/gpr/sync.cc +25 -25
  845. data/src/core/lib/gpr/sync_abseil.cc +36 -40
  846. data/src/core/lib/gpr/sync_posix.cc +22 -34
  847. data/src/core/lib/gpr/sync_windows.cc +29 -27
  848. data/src/core/lib/gpr/time.cc +34 -30
  849. data/src/core/lib/gpr/time_posix.cc +41 -45
  850. data/src/core/lib/gpr/time_precise.cc +22 -22
  851. data/src/core/lib/gpr/time_precise.h +21 -22
  852. data/src/core/lib/gpr/time_windows.cc +35 -29
  853. data/src/core/lib/gpr/tmpfile.h +24 -24
  854. data/src/core/lib/gpr/tmpfile_msys.cc +21 -20
  855. data/src/core/lib/gpr/tmpfile_posix.cc +22 -20
  856. data/src/core/lib/gpr/tmpfile_windows.cc +28 -29
  857. data/src/core/lib/gpr/useful.h +83 -30
  858. data/src/core/lib/gpr/wrap_memcpy.cc +23 -23
  859. data/src/core/lib/gprpp/atomic_utils.h +20 -20
  860. data/src/core/lib/gprpp/bitset.h +35 -17
  861. data/src/core/lib/gprpp/chunked_vector.h +7 -3
  862. data/src/core/lib/gprpp/construct_destruct.h +4 -3
  863. data/src/core/lib/gprpp/cpp_impl_of.h +3 -3
  864. data/src/core/{ext/xds/xds_resource_type.cc → lib/gprpp/crash.cc} +12 -12
  865. data/src/core/lib/gprpp/crash.h +34 -0
  866. data/src/core/lib/gprpp/debug_location.h +60 -31
  867. data/src/core/lib/gprpp/dual_ref_counted.h +4 -7
  868. data/src/core/lib/gprpp/env.h +53 -0
  869. data/src/core/lib/gprpp/env_linux.cc +80 -0
  870. data/src/core/{ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_event_engine.cc → lib/gprpp/env_posix.cc} +25 -9
  871. data/src/core/lib/gprpp/env_windows.cc +56 -0
  872. data/src/core/lib/gprpp/examine_stack.cc +17 -17
  873. data/src/core/lib/gprpp/examine_stack.h +21 -22
  874. data/src/core/lib/gprpp/fork.cc +58 -53
  875. data/src/core/lib/gprpp/fork.h +29 -35
  876. data/src/core/lib/gprpp/global_config.h +22 -24
  877. data/src/core/lib/gprpp/global_config_custom.h +20 -20
  878. data/src/core/lib/gprpp/global_config_env.cc +28 -25
  879. data/src/core/lib/gprpp/global_config_env.h +29 -27
  880. data/src/core/lib/gprpp/global_config_generic.h +21 -25
  881. data/src/core/lib/gprpp/host_port.cc +30 -26
  882. data/src/core/lib/gprpp/host_port.h +32 -31
  883. data/src/core/lib/gprpp/load_file.cc +75 -0
  884. data/src/core/lib/gprpp/load_file.h +33 -0
  885. data/src/core/lib/gprpp/manual_constructor.h +21 -89
  886. data/src/core/lib/gprpp/match.h +5 -3
  887. data/src/core/lib/gprpp/memory.h +22 -26
  888. data/src/core/lib/gprpp/mpscq.cc +17 -17
  889. data/src/core/lib/gprpp/mpscq.h +21 -21
  890. data/src/core/lib/gprpp/no_destruct.h +95 -0
  891. data/src/core/lib/gprpp/notification.h +67 -0
  892. data/src/core/lib/gprpp/orphanable.h +22 -25
  893. data/src/core/lib/gprpp/overload.h +3 -3
  894. data/src/core/lib/gprpp/packed_table.h +40 -0
  895. data/src/core/lib/gprpp/per_cpu.h +46 -0
  896. data/src/core/lib/gprpp/ref_counted.h +22 -24
  897. data/src/core/lib/gprpp/ref_counted_ptr.h +42 -55
  898. data/src/core/lib/gprpp/single_set_ptr.h +3 -3
  899. data/src/core/lib/gprpp/sorted_pack.h +98 -0
  900. data/src/core/lib/gprpp/stat.h +3 -5
  901. data/src/core/lib/gprpp/stat_posix.cc +10 -4
  902. data/src/core/lib/gprpp/stat_windows.cc +4 -2
  903. data/src/core/lib/gprpp/status_helper.cc +55 -35
  904. data/src/core/lib/gprpp/status_helper.h +13 -5
  905. data/src/core/lib/gprpp/strerror.cc +43 -0
  906. data/src/core/lib/gprpp/strerror.h +29 -0
  907. data/src/core/lib/gprpp/sync.h +26 -24
  908. data/src/core/lib/gprpp/table.h +22 -4
  909. data/src/core/lib/gprpp/tchar.cc +49 -0
  910. data/src/core/lib/gprpp/tchar.h +33 -0
  911. data/src/core/lib/gprpp/thd.h +25 -28
  912. data/src/core/lib/gprpp/thd_posix.cc +33 -32
  913. data/src/core/lib/gprpp/thd_windows.cc +28 -26
  914. data/src/core/lib/gprpp/time.cc +52 -9
  915. data/src/core/lib/gprpp/time.h +78 -4
  916. data/src/core/lib/gprpp/time_averaged_stats.cc +60 -0
  917. data/src/core/lib/gprpp/time_averaged_stats.h +79 -0
  918. data/src/core/lib/gprpp/time_util.cc +4 -0
  919. data/src/core/lib/gprpp/time_util.h +3 -3
  920. data/src/core/lib/gprpp/unique_type_name.h +104 -0
  921. data/src/core/lib/gprpp/validation_errors.cc +61 -0
  922. data/src/core/lib/gprpp/validation_errors.h +127 -0
  923. data/src/core/lib/{iomgr → gprpp}/work_serializer.cc +34 -18
  924. data/src/core/lib/{iomgr → gprpp}/work_serializer.h +21 -28
  925. data/src/core/lib/handshaker/proxy_mapper.h +53 -0
  926. data/src/core/lib/handshaker/proxy_mapper_registry.cc +71 -0
  927. data/src/core/lib/handshaker/proxy_mapper_registry.h +75 -0
  928. data/src/core/lib/http/format_request.cc +53 -22
  929. data/src/core/lib/http/format_request.h +23 -21
  930. data/src/core/lib/http/httpcli.cc +139 -141
  931. data/src/core/lib/http/httpcli.h +86 -38
  932. data/src/core/lib/http/httpcli_security_connector.cc +50 -42
  933. data/src/core/lib/http/httpcli_ssl_credentials.h +6 -4
  934. data/src/core/lib/http/parser.cc +78 -90
  935. data/src/core/lib/http/parser.h +38 -35
  936. data/src/core/lib/iomgr/block_annotate.h +23 -23
  937. data/src/core/lib/iomgr/buffer_list.cc +156 -136
  938. data/src/core/lib/iomgr/buffer_list.h +123 -101
  939. data/src/core/lib/iomgr/call_combiner.cc +32 -64
  940. data/src/core/lib/iomgr/call_combiner.h +24 -25
  941. data/src/core/lib/iomgr/cfstream_handle.cc +33 -36
  942. data/src/core/lib/iomgr/cfstream_handle.h +25 -25
  943. data/src/core/lib/iomgr/{event_engine/pollset.h → closure.cc} +9 -7
  944. data/src/core/lib/iomgr/closure.h +95 -58
  945. data/src/core/lib/iomgr/combiner.cc +20 -39
  946. data/src/core/lib/iomgr/combiner.h +20 -20
  947. data/src/core/lib/iomgr/dualstack_socket_posix.cc +21 -21
  948. data/src/core/lib/iomgr/dynamic_annotations.h +22 -22
  949. data/src/core/lib/iomgr/endpoint.cc +21 -21
  950. data/src/core/lib/iomgr/endpoint.h +53 -51
  951. data/src/core/lib/iomgr/endpoint_cfstream.cc +51 -47
  952. data/src/core/lib/iomgr/endpoint_cfstream.h +32 -32
  953. data/src/core/lib/iomgr/endpoint_pair.h +22 -22
  954. data/src/core/lib/iomgr/endpoint_pair_posix.cc +36 -29
  955. data/src/core/lib/iomgr/endpoint_pair_windows.cc +31 -22
  956. data/src/core/lib/iomgr/error.cc +51 -834
  957. data/src/core/lib/iomgr/error.h +45 -317
  958. data/src/core/lib/iomgr/error_cfstream.cc +18 -23
  959. data/src/core/lib/iomgr/error_cfstream.h +21 -21
  960. data/src/core/lib/iomgr/ev_apple.cc +21 -21
  961. data/src/core/lib/iomgr/ev_apple.h +21 -21
  962. data/src/core/lib/iomgr/ev_epoll1_linux.cc +263 -248
  963. data/src/core/lib/iomgr/ev_epoll1_linux.h +21 -21
  964. data/src/core/lib/iomgr/ev_poll_posix.cc +296 -271
  965. data/src/core/lib/iomgr/ev_poll_posix.h +22 -22
  966. data/src/core/lib/iomgr/ev_posix.cc +88 -121
  967. data/src/core/lib/iomgr/ev_posix.h +93 -87
  968. data/src/core/lib/iomgr/ev_windows.cc +18 -18
  969. data/src/core/lib/iomgr/{event_engine → event_engine_shims}/closure.cc +15 -30
  970. data/src/core/lib/iomgr/{event_engine → event_engine_shims}/closure.h +10 -13
  971. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +430 -0
  972. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +43 -0
  973. data/src/core/lib/iomgr/event_engine_shims/tcp_client.cc +91 -0
  974. data/src/core/lib/iomgr/event_engine_shims/tcp_client.h +44 -0
  975. data/src/core/lib/iomgr/exec_ctx.cc +34 -56
  976. data/src/core/lib/iomgr/exec_ctx.h +152 -177
  977. data/src/core/lib/iomgr/executor.cc +21 -31
  978. data/src/core/lib/iomgr/executor.h +27 -30
  979. data/src/core/lib/iomgr/fork_posix.cc +30 -27
  980. data/src/core/lib/iomgr/fork_windows.cc +21 -21
  981. data/src/core/lib/iomgr/gethostname.h +20 -20
  982. data/src/core/lib/iomgr/gethostname_fallback.cc +17 -17
  983. data/src/core/lib/iomgr/gethostname_host_name_max.cc +17 -17
  984. data/src/core/lib/iomgr/gethostname_sysconf.cc +17 -17
  985. data/src/core/lib/iomgr/grpc_if_nametoindex.h +22 -22
  986. data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +20 -19
  987. data/src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc +20 -19
  988. data/src/core/lib/iomgr/internal_errqueue.cc +41 -48
  989. data/src/core/lib/iomgr/internal_errqueue.h +84 -89
  990. data/src/core/lib/iomgr/iocp_windows.cc +23 -23
  991. data/src/core/lib/iomgr/iocp_windows.h +21 -21
  992. data/src/core/lib/iomgr/iomgr.cc +25 -20
  993. data/src/core/lib/iomgr/iomgr.h +35 -35
  994. data/src/core/lib/iomgr/iomgr_fwd.h +26 -0
  995. data/src/core/lib/iomgr/iomgr_internal.cc +17 -17
  996. data/src/core/lib/iomgr/iomgr_internal.h +28 -28
  997. data/src/core/lib/iomgr/iomgr_posix.cc +21 -20
  998. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +21 -19
  999. data/src/core/lib/iomgr/iomgr_windows.cc +24 -22
  1000. data/src/core/lib/iomgr/load_file.cc +24 -27
  1001. data/src/core/lib/iomgr/load_file.h +22 -22
  1002. data/src/core/lib/iomgr/lockfree_event.cc +114 -131
  1003. data/src/core/lib/iomgr/lockfree_event.h +23 -23
  1004. data/src/core/lib/iomgr/nameser.h +86 -86
  1005. data/src/core/lib/iomgr/polling_entity.cc +25 -21
  1006. data/src/core/lib/iomgr/polling_entity.h +29 -29
  1007. data/src/core/lib/iomgr/pollset.cc +17 -17
  1008. data/src/core/lib/iomgr/pollset.h +55 -55
  1009. data/src/core/lib/iomgr/pollset_set.cc +17 -17
  1010. data/src/core/lib/iomgr/pollset_set.h +26 -28
  1011. data/src/core/lib/iomgr/pollset_set_windows.cc +18 -18
  1012. data/src/core/lib/iomgr/pollset_set_windows.h +20 -20
  1013. data/src/core/lib/iomgr/pollset_windows.cc +32 -31
  1014. data/src/core/lib/iomgr/pollset_windows.h +24 -24
  1015. data/src/core/lib/iomgr/port.h +59 -37
  1016. data/src/core/lib/iomgr/python_util.h +24 -24
  1017. data/src/core/lib/iomgr/resolve_address.cc +34 -20
  1018. data/src/core/lib/iomgr/resolve_address.h +73 -43
  1019. data/src/core/lib/iomgr/resolve_address_impl.h +7 -7
  1020. data/src/core/lib/iomgr/resolve_address_posix.cc +81 -62
  1021. data/src/core/lib/iomgr/resolve_address_posix.h +26 -10
  1022. data/src/core/lib/iomgr/resolve_address_windows.cc +64 -38
  1023. data/src/core/lib/iomgr/resolve_address_windows.h +26 -10
  1024. data/src/core/lib/iomgr/resolved_address.h +3 -3
  1025. data/src/core/lib/iomgr/sockaddr.h +25 -26
  1026. data/src/core/lib/iomgr/sockaddr_posix.h +23 -21
  1027. data/src/core/lib/iomgr/sockaddr_utils_posix.cc +20 -18
  1028. data/src/core/lib/iomgr/sockaddr_windows.h +23 -21
  1029. data/src/core/lib/iomgr/socket_factory_posix.cc +18 -18
  1030. data/src/core/lib/iomgr/socket_factory_posix.h +32 -32
  1031. data/src/core/lib/iomgr/socket_mutator.cc +19 -18
  1032. data/src/core/lib/iomgr/socket_mutator.h +39 -39
  1033. data/src/core/lib/iomgr/socket_utils.h +27 -27
  1034. data/src/core/lib/iomgr/socket_utils_common_posix.cc +82 -101
  1035. data/src/core/lib/iomgr/socket_utils_linux.cc +18 -17
  1036. data/src/core/lib/iomgr/socket_utils_posix.cc +103 -19
  1037. data/src/core/lib/iomgr/socket_utils_posix.h +176 -84
  1038. data/src/core/lib/iomgr/socket_utils_windows.cc +20 -19
  1039. data/src/core/lib/iomgr/socket_windows.cc +37 -36
  1040. data/src/core/lib/iomgr/socket_windows.h +59 -61
  1041. data/src/core/lib/iomgr/systemd_utils.cc +116 -0
  1042. data/src/core/lib/iomgr/systemd_utils.h +33 -0
  1043. data/src/core/lib/iomgr/tcp_client.cc +28 -24
  1044. data/src/core/lib/iomgr/tcp_client.h +49 -38
  1045. data/src/core/lib/iomgr/tcp_client_cfstream.cc +46 -35
  1046. data/src/core/lib/iomgr/tcp_client_posix.cc +243 -105
  1047. data/src/core/lib/iomgr/tcp_client_posix.h +55 -52
  1048. data/src/core/lib/iomgr/tcp_client_windows.cc +73 -53
  1049. data/src/core/lib/iomgr/tcp_posix.cc +505 -362
  1050. data/src/core/lib/iomgr/tcp_posix.h +32 -30
  1051. data/src/core/lib/iomgr/tcp_server.cc +33 -24
  1052. data/src/core/lib/iomgr/tcp_server.h +78 -69
  1053. data/src/core/lib/iomgr/tcp_server_posix.cc +381 -133
  1054. data/src/core/lib/iomgr/tcp_server_utils_posix.h +68 -55
  1055. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +120 -82
  1056. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +46 -43
  1057. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +19 -19
  1058. data/src/core/lib/iomgr/tcp_server_windows.cc +116 -118
  1059. data/src/core/lib/iomgr/tcp_windows.cc +116 -98
  1060. data/src/core/lib/iomgr/tcp_windows.h +34 -35
  1061. data/src/core/lib/iomgr/timer.cc +17 -17
  1062. data/src/core/lib/iomgr/timer.h +68 -68
  1063. data/src/core/lib/iomgr/timer_generic.cc +125 -134
  1064. data/src/core/lib/iomgr/timer_generic.h +21 -21
  1065. data/src/core/lib/iomgr/timer_heap.cc +25 -25
  1066. data/src/core/lib/iomgr/timer_heap.h +22 -22
  1067. data/src/core/lib/iomgr/timer_manager.cc +31 -31
  1068. data/src/core/lib/iomgr/timer_manager.h +27 -27
  1069. data/src/core/lib/iomgr/unix_sockets_posix.cc +20 -21
  1070. data/src/core/lib/iomgr/unix_sockets_posix.h +21 -21
  1071. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +19 -17
  1072. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +23 -23
  1073. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +23 -23
  1074. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +29 -26
  1075. data/src/core/lib/iomgr/wakeup_fd_pipe.h +20 -20
  1076. data/src/core/lib/iomgr/wakeup_fd_posix.cc +33 -30
  1077. data/src/core/lib/iomgr/wakeup_fd_posix.h +52 -54
  1078. data/src/core/lib/json/json.h +23 -27
  1079. data/src/core/{ext/filters/http/message_compress/message_decompress_filter.h → lib/json/json_args.h} +13 -10
  1080. data/src/core/lib/json/json_channel_args.h +42 -0
  1081. data/src/core/lib/json/json_object_loader.cc +217 -0
  1082. data/src/core/lib/json/json_object_loader.h +634 -0
  1083. data/src/core/lib/json/json_reader.cc +123 -90
  1084. data/src/core/lib/json/json_util.cc +14 -34
  1085. data/src/core/lib/json/json_util.h +17 -8
  1086. data/src/core/lib/json/json_writer.cc +62 -57
  1087. data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy.cc +30 -60
  1088. data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy.h +47 -62
  1089. data/src/core/lib/load_balancing/lb_policy_factory.h +49 -0
  1090. data/src/core/lib/load_balancing/lb_policy_registry.cc +142 -0
  1091. data/src/core/lib/load_balancing/lb_policy_registry.h +82 -0
  1092. data/src/core/{ext/filters/client_channel → lib/load_balancing}/subchannel_interface.h +57 -52
  1093. data/src/core/lib/matchers/matchers.cc +12 -7
  1094. data/src/core/lib/matchers/matchers.h +5 -3
  1095. data/src/core/lib/promise/activity.cc +23 -8
  1096. data/src/core/lib/promise/activity.h +116 -58
  1097. data/src/core/lib/promise/arena_promise.h +115 -72
  1098. data/src/core/lib/promise/context.h +18 -11
  1099. data/src/core/lib/promise/detail/basic_join.h +197 -0
  1100. data/src/core/lib/promise/detail/basic_seq.h +28 -33
  1101. data/src/core/lib/promise/detail/promise_factory.h +61 -14
  1102. data/src/core/lib/promise/detail/promise_like.h +3 -3
  1103. data/src/core/lib/promise/detail/status.h +31 -3
  1104. data/src/core/lib/promise/detail/switch.h +21 -21
  1105. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +23 -15
  1106. data/src/core/lib/promise/if.h +195 -0
  1107. data/src/core/lib/promise/interceptor_list.h +308 -0
  1108. data/src/core/lib/promise/intra_activity_waiter.h +9 -3
  1109. data/src/core/lib/promise/latch.h +109 -22
  1110. data/src/core/lib/promise/loop.h +13 -9
  1111. data/src/core/lib/promise/map.h +4 -6
  1112. data/src/core/lib/promise/pipe.h +608 -0
  1113. data/src/core/lib/promise/poll.h +129 -11
  1114. data/src/core/lib/promise/promise.h +5 -5
  1115. data/src/core/lib/promise/race.h +6 -10
  1116. data/src/core/lib/promise/seq.h +32 -14
  1117. data/src/core/lib/promise/sleep.cc +58 -42
  1118. data/src/core/lib/promise/sleep.h +44 -26
  1119. data/src/core/lib/promise/trace.cc +20 -0
  1120. data/src/core/lib/promise/trace.h +24 -0
  1121. data/src/core/lib/promise/try_join.h +82 -0
  1122. data/src/core/lib/promise/try_seq.h +41 -23
  1123. data/src/core/lib/resolver/resolver.cc +17 -59
  1124. data/src/core/lib/resolver/resolver.h +21 -18
  1125. data/src/core/lib/resolver/resolver_factory.h +11 -10
  1126. data/src/core/lib/resolver/resolver_registry.cc +17 -9
  1127. data/src/core/lib/resolver/resolver_registry.h +15 -5
  1128. data/src/core/lib/resolver/server_address.cc +46 -34
  1129. data/src/core/lib/resolver/server_address.h +36 -35
  1130. data/src/core/lib/resource_quota/api.cc +23 -2
  1131. data/src/core/lib/resource_quota/api.h +13 -4
  1132. data/src/core/lib/resource_quota/arena.cc +85 -27
  1133. data/src/core/lib/resource_quota/arena.h +197 -25
  1134. data/src/core/lib/resource_quota/memory_quota.cc +322 -101
  1135. data/src/core/lib/resource_quota/memory_quota.h +191 -56
  1136. data/src/core/lib/resource_quota/periodic_update.cc +78 -0
  1137. data/src/core/lib/resource_quota/periodic_update.h +71 -0
  1138. data/src/core/lib/resource_quota/resource_quota.h +12 -4
  1139. data/src/core/lib/resource_quota/thread_quota.cc +2 -0
  1140. data/src/core/lib/resource_quota/thread_quota.h +7 -3
  1141. data/src/core/lib/resource_quota/trace.h +3 -3
  1142. data/src/core/lib/security/authorization/authorization_engine.h +3 -3
  1143. data/src/core/lib/security/authorization/authorization_policy_provider.h +10 -3
  1144. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +3 -0
  1145. data/src/core/lib/security/authorization/evaluate_args.cc +17 -8
  1146. data/src/core/lib/security/authorization/evaluate_args.h +9 -6
  1147. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +5 -1
  1148. data/src/core/lib/security/authorization/grpc_authorization_engine.h +10 -3
  1149. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +19 -3
  1150. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +16 -5
  1151. data/src/core/lib/security/authorization/matchers.cc +44 -30
  1152. data/src/core/lib/security/authorization/matchers.h +10 -3
  1153. data/src/core/lib/security/authorization/rbac_policy.cc +6 -2
  1154. data/src/core/lib/security/authorization/rbac_policy.h +10 -3
  1155. data/src/core/{ext/xds → lib/security/certificate_provider}/certificate_provider_factory.h +9 -4
  1156. data/src/core/lib/security/certificate_provider/certificate_provider_registry.cc +60 -0
  1157. data/src/core/lib/security/certificate_provider/certificate_provider_registry.h +70 -0
  1158. data/src/core/lib/security/context/security_context.cc +27 -25
  1159. data/src/core/lib/security/context/security_context.h +56 -34
  1160. data/src/core/lib/security/credentials/alts/alts_credentials.cc +31 -24
  1161. data/src/core/lib/security/credentials/alts/alts_credentials.h +63 -59
  1162. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +19 -19
  1163. data/src/core/lib/security/credentials/alts/check_gcp_environment.h +43 -43
  1164. data/src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc +17 -17
  1165. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +18 -17
  1166. data/src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc +18 -17
  1167. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +20 -22
  1168. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc +18 -18
  1169. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h +38 -39
  1170. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +19 -22
  1171. data/src/core/lib/security/credentials/call_creds_util.cc +10 -0
  1172. data/src/core/lib/security/credentials/call_creds_util.h +4 -3
  1173. data/src/core/lib/security/credentials/channel_creds_registry.h +10 -4
  1174. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +13 -3
  1175. data/src/core/lib/security/credentials/composite/composite_credentials.cc +34 -34
  1176. data/src/core/lib/security/credentials/composite/composite_credentials.h +45 -33
  1177. data/src/core/lib/security/credentials/credentials.cc +23 -26
  1178. data/src/core/lib/security/credentials/credentials.h +79 -65
  1179. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +202 -74
  1180. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +21 -3
  1181. data/src/core/lib/security/credentials/external/aws_request_signer.cc +14 -3
  1182. data/src/core/lib/security/credentials/external/aws_request_signer.h +3 -3
  1183. data/src/core/lib/security/credentials/external/external_account_credentials.cc +86 -68
  1184. data/src/core/lib/security/credentials/external/external_account_credentials.h +14 -3
  1185. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +29 -26
  1186. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +9 -3
  1187. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +44 -31
  1188. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +13 -3
  1189. data/src/core/lib/security/credentials/fake/fake_credentials.cc +43 -39
  1190. data/src/core/lib/security/credentials/fake/fake_credentials.h +51 -44
  1191. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +23 -25
  1192. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +146 -114
  1193. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +33 -27
  1194. data/src/core/lib/security/credentials/iam/iam_credentials.cc +31 -21
  1195. data/src/core/lib/security/credentials/iam/iam_credentials.h +33 -23
  1196. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +15 -5
  1197. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +14 -10
  1198. data/src/core/lib/security/credentials/jwt/json_token.cc +40 -29
  1199. data/src/core/lib/security/credentials/jwt/json_token.h +36 -36
  1200. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +32 -29
  1201. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +37 -23
  1202. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +113 -89
  1203. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +49 -47
  1204. data/src/core/lib/security/credentials/local/local_credentials.cc +32 -26
  1205. data/src/core/lib/security/credentials/local/local_credentials.h +34 -28
  1206. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +95 -87
  1207. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +46 -25
  1208. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +35 -31
  1209. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +48 -24
  1210. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +44 -42
  1211. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +39 -27
  1212. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +22 -30
  1213. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +16 -17
  1214. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +65 -48
  1215. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +27 -16
  1216. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +36 -4
  1217. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +37 -14
  1218. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +22 -23
  1219. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +3 -3
  1220. data/src/core/lib/security/credentials/tls/tls_credentials.cc +46 -44
  1221. data/src/core/lib/security/credentials/tls/tls_credentials.h +30 -27
  1222. data/src/core/lib/security/credentials/tls/tls_utils.cc +5 -1
  1223. data/src/core/lib/security/credentials/tls/tls_utils.h +4 -4
  1224. data/src/core/lib/security/credentials/xds/xds_credentials.cc +33 -35
  1225. data/src/core/lib/security/credentials/xds/xds_credentials.h +24 -10
  1226. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +60 -54
  1227. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +49 -47
  1228. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +75 -79
  1229. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +25 -26
  1230. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +15 -6
  1231. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +26 -15
  1232. data/src/core/lib/security/security_connector/load_system_roots.h +20 -20
  1233. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +22 -20
  1234. data/src/core/lib/security/security_connector/{load_system_roots_linux.cc → load_system_roots_supported.cc} +43 -38
  1235. data/src/core/lib/security/security_connector/load_system_roots_supported.h +45 -0
  1236. data/src/core/lib/security/security_connector/local/local_security_connector.cc +64 -47
  1237. data/src/core/lib/security/security_connector/local/local_security_connector.h +49 -46
  1238. data/src/core/lib/security/security_connector/security_connector.cc +37 -35
  1239. data/src/core/lib/security/security_connector/security_connector.h +58 -45
  1240. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +55 -46
  1241. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +44 -43
  1242. data/src/core/lib/security/security_connector/ssl_utils.cc +47 -39
  1243. data/src/core/lib/security/security_connector/ssl_utils.h +45 -42
  1244. data/src/core/lib/security/security_connector/ssl_utils_config.cc +22 -22
  1245. data/src/core/lib/security/security_connector/ssl_utils_config.h +21 -22
  1246. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +58 -56
  1247. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +48 -28
  1248. data/src/core/lib/security/transport/auth_filters.h +53 -24
  1249. data/src/core/lib/security/transport/client_auth_filter.cc +57 -40
  1250. data/src/core/lib/security/transport/secure_endpoint.cc +130 -75
  1251. data/src/core/lib/security/transport/secure_endpoint.h +28 -27
  1252. data/src/core/lib/security/transport/security_handshaker.cc +144 -114
  1253. data/src/core/lib/security/transport/security_handshaker.h +28 -23
  1254. data/src/core/lib/security/transport/server_auth_filter.cc +157 -266
  1255. data/src/core/lib/security/transport/tsi_error.cc +23 -20
  1256. data/src/core/lib/security/transport/tsi_error.h +20 -20
  1257. data/src/core/lib/security/util/json_util.cc +24 -24
  1258. data/src/core/lib/security/util/json_util.h +21 -23
  1259. data/src/core/lib/service_config/service_config.h +19 -12
  1260. data/src/core/lib/service_config/service_config_call_data.h +15 -5
  1261. data/src/core/lib/service_config/service_config_impl.cc +111 -150
  1262. data/src/core/lib/service_config/service_config_impl.h +27 -27
  1263. data/src/core/lib/service_config/service_config_parser.cc +16 -28
  1264. data/src/core/lib/service_config/service_config_parser.h +18 -19
  1265. data/src/core/lib/slice/b64.cc +26 -26
  1266. data/src/core/lib/slice/b64.h +34 -32
  1267. data/src/core/lib/slice/percent_encoding.cc +24 -30
  1268. data/src/core/lib/slice/percent_encoding.h +28 -34
  1269. data/src/core/lib/slice/slice.cc +59 -46
  1270. data/src/core/lib/slice/slice.h +64 -20
  1271. data/src/core/lib/slice/slice_buffer.cc +136 -76
  1272. data/src/core/lib/slice/slice_buffer.h +168 -0
  1273. data/src/core/lib/slice/slice_internal.h +38 -45
  1274. data/src/core/lib/slice/slice_refcount.cc +3 -18
  1275. data/src/core/lib/slice/slice_refcount.h +53 -19
  1276. data/src/core/lib/slice/slice_string_helpers.cc +17 -33
  1277. data/src/core/lib/slice/slice_string_helpers.h +23 -30
  1278. data/src/core/lib/surface/api_trace.cc +17 -17
  1279. data/src/core/lib/surface/api_trace.h +25 -25
  1280. data/src/core/lib/surface/builtins.cc +7 -2
  1281. data/src/core/lib/surface/builtins.h +3 -3
  1282. data/src/core/lib/surface/byte_buffer.cc +26 -21
  1283. data/src/core/lib/surface/byte_buffer_reader.cc +24 -24
  1284. data/src/core/lib/surface/call.cc +2232 -483
  1285. data/src/core/lib/surface/call.h +135 -42
  1286. data/src/core/lib/surface/call_details.cc +22 -23
  1287. data/src/core/lib/surface/call_log_batch.cc +25 -18
  1288. data/src/core/lib/surface/call_test_only.h +34 -31
  1289. data/src/core/lib/surface/call_trace.cc +123 -0
  1290. data/src/core/{ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_event_engine.cc → lib/surface/call_trace.h} +12 -10
  1291. data/src/core/lib/surface/channel.cc +217 -284
  1292. data/src/core/lib/surface/channel.h +137 -90
  1293. data/src/core/lib/surface/channel_init.cc +17 -17
  1294. data/src/core/lib/surface/channel_init.h +22 -20
  1295. data/src/core/lib/surface/channel_ping.cc +26 -20
  1296. data/src/core/lib/surface/channel_stack_type.cc +21 -19
  1297. data/src/core/lib/surface/channel_stack_type.h +22 -22
  1298. data/src/core/lib/surface/completion_queue.cc +200 -222
  1299. data/src/core/lib/surface/completion_queue.h +42 -40
  1300. data/src/core/lib/surface/completion_queue_factory.cc +34 -28
  1301. data/src/core/lib/surface/completion_queue_factory.h +21 -23
  1302. data/src/core/lib/surface/event_string.cc +19 -24
  1303. data/src/core/lib/surface/event_string.h +21 -21
  1304. data/src/core/lib/surface/init.cc +57 -114
  1305. data/src/core/lib/surface/init.h +20 -28
  1306. data/src/core/lib/surface/init_internally.cc +25 -0
  1307. data/src/core/lib/surface/init_internally.h +37 -0
  1308. data/src/core/lib/surface/lame_client.cc +87 -130
  1309. data/src/core/lib/surface/lame_client.h +62 -24
  1310. data/src/core/lib/surface/metadata_array.cc +18 -17
  1311. data/src/core/lib/surface/server.cc +406 -174
  1312. data/src/core/lib/surface/server.h +56 -24
  1313. data/src/core/lib/surface/validate_metadata.cc +64 -77
  1314. data/src/core/lib/surface/validate_metadata.h +33 -21
  1315. data/src/core/lib/surface/version.cc +21 -21
  1316. data/src/core/lib/transport/bdp_estimator.cc +19 -19
  1317. data/src/core/lib/transport/bdp_estimator.h +22 -24
  1318. data/src/core/lib/transport/connectivity_state.cc +24 -23
  1319. data/src/core/lib/transport/connectivity_state.h +24 -25
  1320. data/src/core/lib/transport/error_utils.cc +57 -79
  1321. data/src/core/lib/transport/error_utils.h +29 -25
  1322. data/src/core/lib/{channel → transport}/handshaker.cc +75 -58
  1323. data/src/core/lib/{channel → transport}/handshaker.h +59 -48
  1324. data/src/core/lib/transport/handshaker_factory.h +74 -0
  1325. data/src/core/lib/transport/handshaker_registry.cc +61 -0
  1326. data/src/core/lib/transport/handshaker_registry.h +69 -0
  1327. data/src/core/lib/transport/http2_errors.h +22 -22
  1328. data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.cc +78 -65
  1329. data/src/core/lib/transport/http_connect_handshaker.h +42 -0
  1330. data/src/core/lib/transport/metadata_batch.cc +305 -0
  1331. data/src/core/lib/transport/metadata_batch.h +405 -304
  1332. data/src/core/lib/transport/parsed_metadata.cc +2 -4
  1333. data/src/core/lib/transport/parsed_metadata.h +33 -14
  1334. data/src/core/lib/transport/pid_controller.cc +20 -20
  1335. data/src/core/lib/transport/pid_controller.h +27 -27
  1336. data/src/core/lib/transport/status_conversion.cc +23 -23
  1337. data/src/core/lib/transport/status_conversion.h +24 -24
  1338. data/src/core/lib/transport/tcp_connect_handshaker.cc +245 -0
  1339. data/src/core/lib/transport/tcp_connect_handshaker.h +39 -0
  1340. data/src/core/lib/transport/timeout_encoding.cc +24 -28
  1341. data/src/core/lib/transport/timeout_encoding.h +25 -21
  1342. data/src/core/lib/transport/transport.cc +97 -57
  1343. data/src/core/lib/transport/transport.h +243 -213
  1344. data/src/core/lib/transport/transport_fwd.h +20 -0
  1345. data/src/core/lib/transport/transport_impl.h +55 -45
  1346. data/src/core/lib/transport/transport_op_string.cc +40 -39
  1347. data/src/core/lib/uri/uri_parser.cc +12 -4
  1348. data/src/core/lib/uri/uri_parser.h +3 -5
  1349. data/src/core/plugin_registry/grpc_plugin_registry.cc +60 -69
  1350. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +20 -39
  1351. data/src/core/tsi/alts/crypt/aes_gcm.cc +20 -20
  1352. data/src/core/tsi/alts/crypt/gsec.cc +26 -26
  1353. data/src/core/tsi/alts/crypt/gsec.h +336 -336
  1354. data/src/core/tsi/alts/frame_protector/alts_counter.cc +23 -23
  1355. data/src/core/tsi/alts/frame_protector/alts_counter.h +68 -68
  1356. data/src/core/tsi/alts/frame_protector/alts_crypter.cc +19 -19
  1357. data/src/core/tsi/alts/frame_protector/alts_crypter.h +209 -209
  1358. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +72 -71
  1359. data/src/core/tsi/alts/frame_protector/alts_frame_protector.h +40 -40
  1360. data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc +18 -18
  1361. data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h +82 -83
  1362. data/src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc +22 -22
  1363. data/src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc +22 -22
  1364. data/src/core/tsi/alts/frame_protector/frame_handler.cc +26 -25
  1365. data/src/core/tsi/alts/frame_protector/frame_handler.h +169 -169
  1366. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +117 -97
  1367. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +104 -104
  1368. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +18 -17
  1369. data/src/core/tsi/alts/handshaker/alts_shared_resource.h +43 -44
  1370. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +51 -43
  1371. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +60 -60
  1372. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +24 -24
  1373. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +21 -20
  1374. data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +38 -38
  1375. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +19 -19
  1376. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +105 -104
  1377. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +45 -44
  1378. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h +40 -41
  1379. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +38 -36
  1380. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h +35 -36
  1381. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h +67 -68
  1382. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +32 -31
  1383. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +55 -56
  1384. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +54 -53
  1385. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h +141 -142
  1386. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +67 -58
  1387. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h +43 -44
  1388. data/src/core/tsi/fake_transport_security.cc +146 -110
  1389. data/src/core/tsi/fake_transport_security.h +36 -30
  1390. data/src/core/tsi/local_transport_security.cc +43 -38
  1391. data/src/core/tsi/local_transport_security.h +33 -33
  1392. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +9 -4
  1393. data/src/core/tsi/ssl/key_logging/ssl_key_logging.h +3 -3
  1394. data/src/core/tsi/ssl/session_cache/ssl_session.h +23 -21
  1395. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +21 -19
  1396. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +18 -17
  1397. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +31 -22
  1398. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +27 -20
  1399. data/src/core/tsi/ssl_transport_security.cc +299 -370
  1400. data/src/core/tsi/ssl_transport_security.h +206 -203
  1401. data/src/core/tsi/ssl_transport_security_utils.cc +250 -0
  1402. data/src/core/tsi/ssl_transport_security_utils.h +147 -0
  1403. data/src/core/tsi/ssl_types.h +27 -27
  1404. data/src/core/tsi/transport_security.cc +44 -32
  1405. data/src/core/tsi/transport_security.h +49 -48
  1406. data/src/core/tsi/transport_security_grpc.cc +23 -22
  1407. data/src/core/tsi/transport_security_grpc.h +44 -41
  1408. data/src/core/tsi/transport_security_interface.h +344 -332
  1409. data/src/ruby/ext/grpc/ext-export-truffleruby-with-ruby-abi-version.clang +2 -0
  1410. data/src/ruby/ext/grpc/ext-export-truffleruby-with-ruby-abi-version.gcc +7 -0
  1411. data/src/ruby/ext/grpc/ext-export-with-ruby-abi-version.clang +2 -0
  1412. data/src/ruby/ext/grpc/ext-export-with-ruby-abi-version.gcc +7 -0
  1413. data/src/ruby/ext/grpc/ext-export.gcc +1 -1
  1414. data/src/ruby/ext/grpc/extconf.rb +98 -20
  1415. data/src/ruby/ext/grpc/rb_call.c +1 -0
  1416. data/src/ruby/ext/grpc/rb_channel.c +1 -0
  1417. data/src/ruby/ext/grpc/rb_channel_args.c +1 -0
  1418. data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
  1419. data/src/ruby/ext/grpc/rb_grpc.c +1 -0
  1420. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +38 -38
  1421. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +60 -60
  1422. data/src/ruby/ext/grpc/rb_loader.c +6 -2
  1423. data/src/ruby/lib/grpc/errors.rb +1 -1
  1424. data/src/ruby/lib/grpc/generic/bidi_call.rb +2 -0
  1425. data/src/ruby/lib/grpc/version.rb +1 -1
  1426. data/src/ruby/pb/generate_proto_ruby.sh +0 -6
  1427. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +4 -0
  1428. data/src/ruby/spec/channel_spec.rb +5 -43
  1429. data/src/ruby/spec/client_server_spec.rb +20 -8
  1430. data/src/ruby/spec/generic/active_call_spec.rb +12 -3
  1431. data/src/ruby/spec/generic/client_stub_spec.rb +23 -23
  1432. data/src/ruby/spec/generic/server_interceptors_spec.rb +1 -1
  1433. data/src/ruby/spec/user_agent_spec.rb +1 -1
  1434. data/third_party/abseil-cpp/absl/algorithm/container.h +57 -58
  1435. data/third_party/abseil-cpp/absl/base/attributes.h +88 -41
  1436. data/third_party/abseil-cpp/absl/base/casts.h +61 -68
  1437. data/third_party/abseil-cpp/absl/base/config.h +221 -39
  1438. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +12 -42
  1439. data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +52 -2
  1440. data/third_party/abseil-cpp/absl/base/internal/cycleclock_config.h +55 -0
  1441. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +5 -4
  1442. data/third_party/abseil-cpp/absl/base/internal/endian.h +17 -62
  1443. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +2 -0
  1444. data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +3 -3
  1445. data/third_party/abseil-cpp/absl/base/internal/invoke.h +54 -0
  1446. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +2 -2
  1447. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +1 -1
  1448. data/third_party/abseil-cpp/absl/base/internal/prefetch.h +138 -0
  1449. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +39 -28
  1450. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +36 -36
  1451. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +6 -3
  1452. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +10 -6
  1453. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +2 -5
  1454. data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +4 -1
  1455. data/third_party/abseil-cpp/absl/base/internal/strerror.cc +88 -0
  1456. data/third_party/abseil-cpp/absl/base/internal/strerror.h +39 -0
  1457. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +14 -11
  1458. data/third_party/abseil-cpp/absl/base/internal/thread_annotations.h +9 -0
  1459. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +2 -1
  1460. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +4 -0
  1461. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +6 -7
  1462. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +12 -40
  1463. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h +62 -0
  1464. data/third_party/abseil-cpp/absl/base/log_severity.cc +28 -0
  1465. data/third_party/abseil-cpp/absl/base/log_severity.h +51 -0
  1466. data/third_party/abseil-cpp/absl/base/macros.h +4 -21
  1467. data/third_party/abseil-cpp/absl/base/optimization.h +76 -16
  1468. data/third_party/abseil-cpp/absl/base/options.h +1 -7
  1469. data/third_party/abseil-cpp/absl/base/policy_checks.h +15 -13
  1470. data/third_party/abseil-cpp/absl/base/thread_annotations.h +2 -2
  1471. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  1472. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  1473. data/third_party/abseil-cpp/absl/container/fixed_array.h +9 -5
  1474. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +11 -4
  1475. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +503 -0
  1476. data/third_party/abseil-cpp/absl/container/inlined_vector.h +84 -25
  1477. data/third_party/abseil-cpp/absl/container/internal/common.h +9 -8
  1478. data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +132 -0
  1479. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +23 -29
  1480. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +4 -55
  1481. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +116 -23
  1482. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +40 -54
  1483. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +165 -66
  1484. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +159 -4
  1485. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +1121 -470
  1486. data/third_party/abseil-cpp/absl/crc/crc32c.cc +99 -0
  1487. data/third_party/abseil-cpp/absl/crc/crc32c.h +183 -0
  1488. data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.cc +256 -0
  1489. data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.h +57 -0
  1490. data/third_party/abseil-cpp/absl/crc/internal/crc.cc +468 -0
  1491. data/third_party/abseil-cpp/absl/crc/internal/crc.h +91 -0
  1492. data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +269 -0
  1493. data/third_party/abseil-cpp/absl/crc/internal/crc32c.h +39 -0
  1494. data/third_party/abseil-cpp/absl/crc/internal/crc32c_inline.h +72 -0
  1495. data/third_party/abseil-cpp/absl/crc/internal/crc_cord_state.cc +130 -0
  1496. data/third_party/abseil-cpp/absl/crc/internal/crc_cord_state.h +159 -0
  1497. data/third_party/abseil-cpp/absl/crc/internal/crc_internal.h +179 -0
  1498. data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy.h +119 -0
  1499. data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy_fallback.cc +75 -0
  1500. data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy_x86_64.cc +434 -0
  1501. data/third_party/abseil-cpp/absl/crc/internal/crc_non_temporal_memcpy.cc +93 -0
  1502. data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +725 -0
  1503. data/third_party/abseil-cpp/absl/crc/internal/non_temporal_arm_intrinsics.h +79 -0
  1504. data/third_party/abseil-cpp/absl/crc/internal/non_temporal_memcpy.h +180 -0
  1505. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +45 -88
  1506. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +67 -38
  1507. data/third_party/abseil-cpp/absl/debugging/internal/demangle.h +1 -1
  1508. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +16 -13
  1509. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +3 -2
  1510. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +19 -12
  1511. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +8 -3
  1512. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +2 -1
  1513. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +1 -1
  1514. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +8 -3
  1515. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +59 -102
  1516. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +5 -4
  1517. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +41 -11
  1518. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +18 -4
  1519. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +6 -1
  1520. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +3 -2
  1521. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +164 -101
  1522. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +7 -6
  1523. data/third_party/abseil-cpp/absl/functional/any_invocable.h +316 -0
  1524. data/third_party/abseil-cpp/absl/functional/bind_front.h +10 -1
  1525. data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -1
  1526. data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +878 -0
  1527. data/third_party/abseil-cpp/absl/hash/hash.h +82 -8
  1528. data/third_party/abseil-cpp/absl/hash/internal/city.cc +10 -10
  1529. data/third_party/abseil-cpp/absl/hash/internal/hash.h +235 -26
  1530. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +3 -14
  1531. data/third_party/abseil-cpp/absl/memory/memory.h +26 -447
  1532. data/third_party/abseil-cpp/absl/meta/type_traits.h +104 -12
  1533. data/third_party/abseil-cpp/absl/numeric/bits.h +1 -1
  1534. data/third_party/abseil-cpp/absl/numeric/int128.cc +14 -10
  1535. data/third_party/abseil-cpp/absl/numeric/int128.h +2 -2
  1536. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +33 -10
  1537. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +4 -4
  1538. data/third_party/abseil-cpp/absl/random/distributions.h +3 -3
  1539. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +3 -0
  1540. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +4 -2
  1541. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +2 -2
  1542. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +59 -48
  1543. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +3 -24
  1544. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +9 -9
  1545. data/third_party/abseil-cpp/absl/random/internal/randen.h +5 -11
  1546. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +6 -2
  1547. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +48 -23
  1548. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +24 -26
  1549. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +2 -2
  1550. data/third_party/abseil-cpp/absl/random/internal/traits.h +53 -5
  1551. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +5 -5
  1552. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +33 -48
  1553. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +9 -10
  1554. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +7 -4
  1555. data/third_party/abseil-cpp/absl/random/random.h +6 -6
  1556. data/third_party/abseil-cpp/absl/random/seed_sequences.h +1 -0
  1557. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +2 -2
  1558. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
  1559. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +4 -3
  1560. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +18 -0
  1561. data/third_party/abseil-cpp/absl/status/status.cc +193 -14
  1562. data/third_party/abseil-cpp/absl/status/status.h +24 -14
  1563. data/third_party/abseil-cpp/absl/status/statusor.h +9 -3
  1564. data/third_party/abseil-cpp/absl/strings/ascii.cc +5 -5
  1565. data/third_party/abseil-cpp/absl/strings/ascii.h +4 -4
  1566. data/third_party/abseil-cpp/absl/strings/charconv.cc +534 -96
  1567. data/third_party/abseil-cpp/absl/strings/cord.cc +257 -924
  1568. data/third_party/abseil-cpp/absl/strings/cord.h +268 -156
  1569. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +188 -0
  1570. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +44 -0
  1571. data/third_party/abseil-cpp/absl/strings/cord_buffer.cc +30 -0
  1572. data/third_party/abseil-cpp/absl/strings/cord_buffer.h +575 -0
  1573. data/third_party/abseil-cpp/absl/strings/escaping.cc +73 -62
  1574. data/third_party/abseil-cpp/absl/strings/escaping.h +24 -19
  1575. data/third_party/abseil-cpp/absl/strings/internal/char_map.h +14 -12
  1576. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +4 -4
  1577. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +2 -2
  1578. data/third_party/abseil-cpp/absl/strings/internal/cord_data_edge.h +63 -0
  1579. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +20 -32
  1580. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +441 -150
  1581. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +157 -53
  1582. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +70 -73
  1583. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +8 -6
  1584. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +4 -2
  1585. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +3 -2
  1586. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +5 -4
  1587. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +7 -74
  1588. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.cc +56 -0
  1589. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.h +103 -0
  1590. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +58 -17
  1591. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +13 -11
  1592. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h +7 -15
  1593. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +3 -3
  1594. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +19 -43
  1595. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +7 -7
  1596. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +5 -4
  1597. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +4 -2
  1598. data/third_party/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.cc +93 -0
  1599. data/third_party/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.h +34 -0
  1600. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +18 -15
  1601. data/third_party/abseil-cpp/absl/strings/internal/escaping.h +7 -9
  1602. data/third_party/abseil-cpp/absl/strings/internal/has_absl_stringify.h +55 -0
  1603. data/third_party/abseil-cpp/absl/strings/internal/memutil.cc +9 -6
  1604. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +14 -7
  1605. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.h +35 -10
  1606. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +113 -46
  1607. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +127 -30
  1608. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +3 -2
  1609. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +42 -10
  1610. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +56 -289
  1611. data/third_party/abseil-cpp/absl/strings/internal/str_format/constexpr_parser.h +351 -0
  1612. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +6 -6
  1613. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +9 -4
  1614. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +215 -181
  1615. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +2 -1
  1616. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +10 -209
  1617. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +14 -103
  1618. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +9 -6
  1619. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +2 -1
  1620. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +10 -2
  1621. data/third_party/abseil-cpp/absl/strings/internal/stringify_sink.cc +28 -0
  1622. data/third_party/abseil-cpp/absl/strings/internal/stringify_sink.h +57 -0
  1623. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +9 -9
  1624. data/third_party/abseil-cpp/absl/strings/numbers.cc +42 -39
  1625. data/third_party/abseil-cpp/absl/strings/numbers.h +26 -23
  1626. data/third_party/abseil-cpp/absl/strings/str_cat.cc +9 -6
  1627. data/third_party/abseil-cpp/absl/strings/str_cat.h +70 -16
  1628. data/third_party/abseil-cpp/absl/strings/str_format.h +71 -9
  1629. data/third_party/abseil-cpp/absl/strings/str_join.h +9 -15
  1630. data/third_party/abseil-cpp/absl/strings/str_split.h +1 -2
  1631. data/third_party/abseil-cpp/absl/strings/string_view.cc +8 -19
  1632. data/third_party/abseil-cpp/absl/strings/string_view.h +6 -12
  1633. data/third_party/abseil-cpp/absl/strings/strip.h +8 -6
  1634. data/third_party/abseil-cpp/absl/strings/substitute.cc +8 -6
  1635. data/third_party/abseil-cpp/absl/strings/substitute.h +55 -21
  1636. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +9 -6
  1637. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +0 -4
  1638. data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +20 -17
  1639. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +37 -31
  1640. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +22 -8
  1641. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +0 -4
  1642. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -6
  1643. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +0 -25
  1644. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +10 -4
  1645. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +172 -88
  1646. data/third_party/abseil-cpp/absl/synchronization/mutex.h +102 -55
  1647. data/third_party/abseil-cpp/absl/synchronization/notification.cc +0 -1
  1648. data/third_party/abseil-cpp/absl/synchronization/notification.h +3 -3
  1649. data/third_party/abseil-cpp/absl/time/civil_time.cc +26 -0
  1650. data/third_party/abseil-cpp/absl/time/civil_time.h +25 -0
  1651. data/third_party/abseil-cpp/absl/time/clock.cc +17 -11
  1652. data/third_party/abseil-cpp/absl/time/duration.cc +12 -11
  1653. data/third_party/abseil-cpp/absl/time/format.cc +2 -1
  1654. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +11 -7
  1655. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +1 -1
  1656. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +26 -5
  1657. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +7 -6
  1658. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +36 -35
  1659. data/third_party/abseil-cpp/absl/time/time.cc +2 -2
  1660. data/third_party/abseil-cpp/absl/time/time.h +268 -169
  1661. data/third_party/abseil-cpp/absl/types/internal/optional.h +8 -0
  1662. data/third_party/abseil-cpp/absl/types/internal/span.h +30 -19
  1663. data/third_party/abseil-cpp/absl/types/internal/variant.h +28 -40
  1664. data/third_party/abseil-cpp/absl/types/optional.h +17 -14
  1665. data/third_party/abseil-cpp/absl/types/span.h +31 -8
  1666. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +1 -1
  1667. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +1 -2
  1668. data/third_party/re2/re2/bitstate.cc +3 -3
  1669. data/third_party/re2/re2/dfa.cc +13 -13
  1670. data/third_party/re2/re2/nfa.cc +4 -4
  1671. data/third_party/re2/re2/onepass.cc +2 -2
  1672. data/third_party/re2/re2/prefilter_tree.cc +27 -59
  1673. data/third_party/re2/re2/prefilter_tree.h +3 -2
  1674. data/third_party/re2/re2/prog.cc +11 -2
  1675. data/third_party/re2/re2/prog.h +17 -5
  1676. data/third_party/re2/re2/re2.cc +6 -11
  1677. data/third_party/re2/re2/re2.h +1 -1
  1678. data/third_party/re2/re2/regexp.cc +1 -2
  1679. data/third_party/re2/re2/stringpiece.h +10 -7
  1680. data/third_party/re2/re2/unicode_casefold.cc +25 -11
  1681. data/third_party/re2/re2/unicode_groups.cc +319 -151
  1682. data/third_party/re2/re2/walker-inl.h +3 -2
  1683. data/third_party/re2/util/mutex.h +4 -4
  1684. data/third_party/upb/third_party/utf8_range/utf8_range.h +1 -1
  1685. data/third_party/upb/upb/arena.c +277 -0
  1686. data/third_party/upb/upb/arena.h +225 -0
  1687. data/third_party/upb/upb/array.c +114 -0
  1688. data/third_party/upb/upb/array.h +83 -0
  1689. data/third_party/upb/upb/collections.h +36 -0
  1690. data/third_party/upb/upb/decode.c +161 -65
  1691. data/third_party/upb/upb/decode.h +1 -0
  1692. data/third_party/upb/upb/decode_fast.c +1 -1
  1693. data/third_party/upb/upb/def.c +10 -2
  1694. data/third_party/upb/upb/def.h +8 -1
  1695. data/third_party/upb/upb/def.hpp +7 -4
  1696. data/third_party/upb/upb/encode.c +29 -20
  1697. data/third_party/upb/upb/encode.h +16 -6
  1698. data/third_party/upb/upb/extension_registry.c +93 -0
  1699. data/third_party/upb/upb/extension_registry.h +84 -0
  1700. data/third_party/upb/upb/{decode_internal.h → internal/decode.h} +5 -5
  1701. data/third_party/upb/upb/internal/table.h +385 -0
  1702. data/third_party/upb/upb/{upb_internal.h → internal/upb.h} +3 -3
  1703. data/third_party/upb/upb/internal/vsnprintf_compat.h +52 -0
  1704. data/third_party/upb/upb/json_decode.c +1512 -0
  1705. data/third_party/upb/upb/json_decode.h +47 -0
  1706. data/third_party/upb/upb/json_encode.c +7 -3
  1707. data/third_party/upb/upb/json_encode.h +6 -3
  1708. data/third_party/upb/upb/map.c +108 -0
  1709. data/third_party/upb/upb/map.h +117 -0
  1710. data/third_party/upb/upb/message_value.h +66 -0
  1711. data/third_party/upb/upb/mini_table.c +1147 -0
  1712. data/third_party/upb/upb/mini_table.h +189 -0
  1713. data/third_party/upb/upb/mini_table.hpp +112 -0
  1714. data/third_party/upb/upb/msg.c +2 -62
  1715. data/third_party/upb/upb/msg.h +2 -45
  1716. data/third_party/upb/upb/msg_internal.h +28 -22
  1717. data/third_party/upb/upb/port_def.inc +2 -1
  1718. data/third_party/upb/upb/port_undef.inc +1 -0
  1719. data/third_party/upb/upb/reflection.c +2 -159
  1720. data/third_party/upb/upb/reflection.h +2 -112
  1721. data/third_party/upb/upb/status.c +86 -0
  1722. data/third_party/upb/upb/status.h +66 -0
  1723. data/third_party/upb/upb/table.c +2 -2
  1724. data/third_party/upb/upb/table_internal.h +3 -352
  1725. data/third_party/upb/upb/text_encode.c +3 -2
  1726. data/third_party/upb/upb/upb.c +4 -290
  1727. data/third_party/upb/upb/upb.h +7 -196
  1728. data/third_party/zlib/compress.c +3 -3
  1729. data/third_party/zlib/crc32.c +21 -12
  1730. data/third_party/zlib/deflate.c +112 -106
  1731. data/third_party/zlib/deflate.h +2 -2
  1732. data/third_party/zlib/gzlib.c +1 -1
  1733. data/third_party/zlib/gzread.c +3 -5
  1734. data/third_party/zlib/gzwrite.c +1 -1
  1735. data/third_party/zlib/infback.c +10 -7
  1736. data/third_party/zlib/inflate.c +5 -2
  1737. data/third_party/zlib/inftrees.c +2 -2
  1738. data/third_party/zlib/inftrees.h +1 -1
  1739. data/third_party/zlib/trees.c +61 -62
  1740. data/third_party/zlib/uncompr.c +2 -2
  1741. data/third_party/zlib/zconf.h +16 -3
  1742. data/third_party/zlib/zlib.h +10 -10
  1743. data/third_party/zlib/zutil.c +9 -7
  1744. data/third_party/zlib/zutil.h +1 -0
  1745. metadata +372 -102
  1746. data/include/grpc/impl/codegen/gpr_slice.h +0 -71
  1747. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +0 -42
  1748. data/src/core/ext/filters/client_channel/lb_policy_factory.h +0 -48
  1749. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +0 -185
  1750. data/src/core/ext/filters/client_channel/lb_policy_registry.h +0 -65
  1751. data/src/core/ext/filters/client_channel/proxy_mapper.h +0 -54
  1752. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +0 -89
  1753. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +0 -50
  1754. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +0 -186
  1755. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -179
  1756. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +0 -456
  1757. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +0 -53
  1758. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +0 -386
  1759. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +0 -61
  1760. data/src/core/ext/xds/certificate_provider_registry.cc +0 -103
  1761. data/src/core/ext/xds/certificate_provider_registry.h +0 -57
  1762. data/src/core/lib/channel/handshaker_factory.h +0 -50
  1763. data/src/core/lib/channel/handshaker_registry.cc +0 -50
  1764. data/src/core/lib/channel/handshaker_registry.h +0 -71
  1765. data/src/core/lib/event_engine/sockaddr.cc +0 -40
  1766. data/src/core/lib/event_engine/sockaddr.h +0 -44
  1767. data/src/core/lib/gpr/env.h +0 -40
  1768. data/src/core/lib/gpr/env_linux.cc +0 -75
  1769. data/src/core/lib/gpr/env_posix.cc +0 -46
  1770. data/src/core/lib/gpr/env_windows.cc +0 -74
  1771. data/src/core/lib/gpr/murmur_hash.cc +0 -82
  1772. data/src/core/lib/gpr/murmur_hash.h +0 -29
  1773. data/src/core/lib/gpr/string_windows.h +0 -32
  1774. data/src/core/lib/gpr/tls.h +0 -158
  1775. data/src/core/lib/gprpp/capture.h +0 -76
  1776. data/src/core/lib/iomgr/error_internal.h +0 -66
  1777. data/src/core/lib/iomgr/event_engine/endpoint.cc +0 -172
  1778. data/src/core/lib/iomgr/event_engine/endpoint.h +0 -52
  1779. data/src/core/lib/iomgr/event_engine/iomgr.cc +0 -85
  1780. data/src/core/lib/iomgr/event_engine/pollset.cc +0 -87
  1781. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +0 -47
  1782. data/src/core/lib/iomgr/event_engine/resolver.cc +0 -133
  1783. data/src/core/lib/iomgr/event_engine/resolver.h +0 -56
  1784. data/src/core/lib/iomgr/event_engine/tcp.cc +0 -296
  1785. data/src/core/lib/iomgr/event_engine/timer.cc +0 -62
  1786. data/src/core/lib/iomgr/executor/mpmcqueue.cc +0 -182
  1787. data/src/core/lib/iomgr/executor/mpmcqueue.h +0 -171
  1788. data/src/core/lib/iomgr/executor/threadpool.cc +0 -136
  1789. data/src/core/lib/iomgr/executor/threadpool.h +0 -150
  1790. data/src/core/lib/iomgr/time_averaged_stats.cc +0 -64
  1791. data/src/core/lib/iomgr/time_averaged_stats.h +0 -72
  1792. data/src/core/lib/profiling/basic_timers.cc +0 -295
  1793. data/src/core/lib/profiling/stap_timers.cc +0 -50
  1794. data/src/core/lib/profiling/timers.h +0 -94
  1795. data/src/core/lib/promise/call_push_pull.h +0 -144
  1796. data/src/core/lib/security/security_connector/load_system_roots_linux.h +0 -46
  1797. data/src/core/lib/slice/slice_api.cc +0 -39
  1798. data/src/core/lib/slice/slice_refcount_base.h +0 -61
  1799. data/src/core/lib/slice/slice_split.cc +0 -100
  1800. data/src/core/lib/slice/slice_split.h +0 -40
  1801. data/src/core/lib/transport/byte_stream.cc +0 -164
  1802. data/src/core/lib/transport/byte_stream.h +0 -166
  1803. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +0 -50
@@ -16,33 +16,111 @@
16
16
 
17
17
  #include "src/core/lib/channel/promise_based_filter.h"
18
18
 
19
- #include <cstdlib>
19
+ #include <algorithm>
20
+ #include <initializer_list>
21
+ #include <memory>
22
+ #include <string>
23
+ #include <utility>
24
+ #include <vector>
25
+
26
+ #include "absl/base/attributes.h"
27
+ #include "absl/functional/function_ref.h"
28
+ #include "absl/status/status.h"
29
+ #include "absl/strings/str_cat.h"
30
+ #include "absl/strings/str_format.h"
31
+ #include "absl/strings/str_join.h"
32
+
33
+ #include <grpc/status.h>
20
34
 
21
35
  #include "src/core/lib/channel/channel_stack.h"
36
+ #include "src/core/lib/debug/trace.h"
37
+ #include "src/core/lib/gprpp/crash.h"
38
+ #include "src/core/lib/gprpp/manual_constructor.h"
39
+ #include "src/core/lib/gprpp/status_helper.h"
40
+ #include "src/core/lib/iomgr/error.h"
41
+ #include "src/core/lib/promise/detail/basic_seq.h"
42
+ #include "src/core/lib/slice/slice.h"
43
+
44
+ extern grpc_core::TraceFlag grpc_trace_channel;
22
45
 
23
46
  namespace grpc_core {
24
47
  namespace promise_filter_detail {
25
48
 
49
+ namespace {
50
+ class FakeActivity final : public Activity {
51
+ public:
52
+ explicit FakeActivity(Activity* wake_activity)
53
+ : wake_activity_(wake_activity) {}
54
+ void Orphan() override {}
55
+ void ForceImmediateRepoll() override {}
56
+ Waker MakeOwningWaker() override { return wake_activity_->MakeOwningWaker(); }
57
+ Waker MakeNonOwningWaker() override {
58
+ return wake_activity_->MakeNonOwningWaker();
59
+ }
60
+ void Run(absl::FunctionRef<void()> f) {
61
+ ScopedActivity activity(this);
62
+ f();
63
+ }
64
+
65
+ private:
66
+ Activity* const wake_activity_;
67
+ };
68
+
69
+ absl::Status StatusFromMetadata(const ServerMetadata& md) {
70
+ auto status_code = md.get(GrpcStatusMetadata()).value_or(GRPC_STATUS_UNKNOWN);
71
+ if (status_code == GRPC_STATUS_OK) {
72
+ return absl::OkStatus();
73
+ }
74
+ const auto* message = md.get_pointer(GrpcMessageMetadata());
75
+ return grpc_error_set_int(
76
+ absl::Status(static_cast<absl::StatusCode>(status_code),
77
+ message == nullptr ? "" : message->as_string_view()),
78
+ StatusIntProperty::kRpcStatus, status_code);
79
+ }
80
+ } // namespace
81
+
26
82
  ///////////////////////////////////////////////////////////////////////////////
27
83
  // BaseCallData
28
84
 
29
- BaseCallData::BaseCallData(grpc_call_element* elem,
30
- const grpc_call_element_args* args, uint8_t flags)
85
+ BaseCallData::BaseCallData(
86
+ grpc_call_element* elem, const grpc_call_element_args* args, uint8_t flags,
87
+ absl::FunctionRef<Interceptor*()> make_send_interceptor,
88
+ absl::FunctionRef<Interceptor*()> make_recv_interceptor)
31
89
  : call_stack_(args->call_stack),
32
90
  elem_(elem),
33
91
  arena_(args->arena),
34
92
  call_combiner_(args->call_combiner),
35
93
  deadline_(args->deadline),
36
- context_(args->context) {
37
- if (flags & kFilterExaminesServerInitialMetadata) {
38
- server_initial_metadata_latch_ = arena_->New<Latch<ServerMetadata*>>();
39
- }
94
+ context_(args->context),
95
+ server_initial_metadata_pipe_(
96
+ flags & kFilterExaminesServerInitialMetadata
97
+ ? arena_->New<Pipe<ServerMetadataHandle>>(arena_)
98
+ : nullptr),
99
+ send_message_(
100
+ flags & kFilterExaminesOutboundMessages
101
+ ? arena_->New<SendMessage>(this, make_send_interceptor())
102
+ : nullptr),
103
+ receive_message_(
104
+ flags & kFilterExaminesInboundMessages
105
+ ? arena_->New<ReceiveMessage>(this, make_recv_interceptor())
106
+ : nullptr),
107
+ event_engine_(
108
+ static_cast<ChannelFilter*>(elem->channel_data)
109
+ ->hack_until_per_channel_stack_event_engines_land_get_event_engine()) {
40
110
  }
41
111
 
42
112
  BaseCallData::~BaseCallData() {
43
- if (server_initial_metadata_latch_ != nullptr) {
44
- server_initial_metadata_latch_->~Latch();
45
- }
113
+ FakeActivity(this).Run([this] {
114
+ if (send_message_ != nullptr) {
115
+ send_message_->~SendMessage();
116
+ }
117
+ if (receive_message_ != nullptr) {
118
+ receive_message_->~ReceiveMessage();
119
+ }
120
+ if (server_initial_metadata_pipe_ != nullptr) {
121
+ server_initial_metadata_pipe_->~Pipe();
122
+ }
123
+ });
46
124
  }
47
125
 
48
126
  // We don't form ActivityPtr's to this type, and consequently don't need
@@ -55,20 +133,776 @@ Waker BaseCallData::MakeNonOwningWaker() { return MakeOwningWaker(); }
55
133
 
56
134
  Waker BaseCallData::MakeOwningWaker() {
57
135
  GRPC_CALL_STACK_REF(call_stack_, "waker");
58
- return Waker(this);
136
+ return Waker(this, nullptr);
59
137
  }
60
138
 
61
- void BaseCallData::Wakeup() {
139
+ void BaseCallData::Wakeup(void*) {
62
140
  auto wakeup = [](void* p, grpc_error_handle) {
63
141
  auto* self = static_cast<BaseCallData*>(p);
64
142
  self->OnWakeup();
65
- self->Drop();
143
+ self->Drop(nullptr);
66
144
  };
67
145
  auto* closure = GRPC_CLOSURE_CREATE(wakeup, this, nullptr);
68
- GRPC_CALL_COMBINER_START(call_combiner_, closure, GRPC_ERROR_NONE, "wakeup");
146
+ GRPC_CALL_COMBINER_START(call_combiner_, closure, absl::OkStatus(), "wakeup");
147
+ }
148
+
149
+ void BaseCallData::Drop(void*) { GRPC_CALL_STACK_UNREF(call_stack_, "waker"); }
150
+
151
+ std::string BaseCallData::LogTag() const {
152
+ return absl::StrCat(
153
+ ClientOrServerString(), "[", elem_->filter->name, ":0x",
154
+ absl::Hex(reinterpret_cast<uintptr_t>(elem_), absl::kZeroPad8), "]");
155
+ }
156
+
157
+ ///////////////////////////////////////////////////////////////////////////////
158
+ // BaseCallData::CapturedBatch
159
+
160
+ namespace {
161
+ uintptr_t* RefCountField(grpc_transport_stream_op_batch* b) {
162
+ return &b->handler_private.closure.error_data.scratch;
163
+ }
164
+ } // namespace
165
+
166
+ BaseCallData::CapturedBatch::CapturedBatch() : batch_(nullptr) {}
167
+
168
+ BaseCallData::CapturedBatch::CapturedBatch(
169
+ grpc_transport_stream_op_batch* batch) {
170
+ *RefCountField(batch) = 1;
171
+ batch_ = batch;
172
+ }
173
+
174
+ BaseCallData::CapturedBatch::~CapturedBatch() {
175
+ if (batch_ == nullptr) return;
176
+ // A ref can be dropped by destruction, but it must not release the batch
177
+ uintptr_t& refcnt = *RefCountField(batch_);
178
+ if (refcnt == 0) return; // refcnt==0 ==> cancelled
179
+ --refcnt;
180
+ GPR_ASSERT(refcnt != 0);
181
+ }
182
+
183
+ BaseCallData::CapturedBatch::CapturedBatch(const CapturedBatch& rhs)
184
+ : batch_(rhs.batch_) {
185
+ if (batch_ == nullptr) return;
186
+ uintptr_t& refcnt = *RefCountField(batch_);
187
+ if (refcnt == 0) return; // refcnt==0 ==> cancelled
188
+ ++refcnt;
189
+ }
190
+
191
+ BaseCallData::CapturedBatch& BaseCallData::CapturedBatch::operator=(
192
+ const CapturedBatch& b) {
193
+ CapturedBatch temp(b);
194
+ Swap(&temp);
195
+ return *this;
196
+ }
197
+
198
+ BaseCallData::CapturedBatch::CapturedBatch(CapturedBatch&& rhs) noexcept
199
+ : batch_(rhs.batch_) {
200
+ rhs.batch_ = nullptr;
201
+ }
202
+
203
+ BaseCallData::CapturedBatch& BaseCallData::CapturedBatch::operator=(
204
+ CapturedBatch&& b) noexcept {
205
+ Swap(&b);
206
+ return *this;
207
+ }
208
+
209
+ void BaseCallData::CapturedBatch::ResumeWith(Flusher* releaser) {
210
+ auto* batch = std::exchange(batch_, nullptr);
211
+ GPR_ASSERT(batch != nullptr);
212
+ uintptr_t& refcnt = *RefCountField(batch);
213
+ if (refcnt == 0) {
214
+ // refcnt==0 ==> cancelled
215
+ if (grpc_trace_channel.enabled()) {
216
+ gpr_log(GPR_INFO, "%sRESUME BATCH REQUEST CANCELLED",
217
+ Activity::current()->DebugTag().c_str());
218
+ }
219
+ return;
220
+ }
221
+ if (--refcnt == 0) {
222
+ releaser->Resume(batch);
223
+ }
224
+ }
225
+
226
+ void BaseCallData::CapturedBatch::CompleteWith(Flusher* releaser) {
227
+ auto* batch = std::exchange(batch_, nullptr);
228
+ GPR_ASSERT(batch != nullptr);
229
+ uintptr_t& refcnt = *RefCountField(batch);
230
+ if (refcnt == 0) return; // refcnt==0 ==> cancelled
231
+ if (--refcnt == 0) {
232
+ releaser->Complete(batch);
233
+ }
234
+ }
235
+
236
+ void BaseCallData::CapturedBatch::CancelWith(grpc_error_handle error,
237
+ Flusher* releaser) {
238
+ auto* batch = std::exchange(batch_, nullptr);
239
+ GPR_ASSERT(batch != nullptr);
240
+ uintptr_t& refcnt = *RefCountField(batch);
241
+ if (refcnt == 0) {
242
+ // refcnt==0 ==> cancelled
243
+ if (grpc_trace_channel.enabled()) {
244
+ gpr_log(GPR_INFO, "%sCANCEL BATCH REQUEST ALREADY CANCELLED",
245
+ Activity::current()->DebugTag().c_str());
246
+ }
247
+ return;
248
+ }
249
+ refcnt = 0;
250
+ releaser->Cancel(batch, error);
251
+ }
252
+
253
+ ///////////////////////////////////////////////////////////////////////////////
254
+ // BaseCallData::Flusher
255
+
256
+ BaseCallData::Flusher::Flusher(BaseCallData* call) : call_(call) {
257
+ GRPC_CALL_STACK_REF(call_->call_stack(), "flusher");
258
+ }
259
+
260
+ BaseCallData::Flusher::~Flusher() {
261
+ if (release_.empty()) {
262
+ if (call_closures_.size() == 0) {
263
+ GRPC_CALL_COMBINER_STOP(call_->call_combiner(), "nothing to flush");
264
+ GRPC_CALL_STACK_UNREF(call_->call_stack(), "flusher");
265
+ return;
266
+ }
267
+ call_closures_.RunClosures(call_->call_combiner());
268
+ GRPC_CALL_STACK_UNREF(call_->call_stack(), "flusher");
269
+ return;
270
+ }
271
+ auto call_next_op = [](void* p, grpc_error_handle) {
272
+ auto* batch = static_cast<grpc_transport_stream_op_batch*>(p);
273
+ BaseCallData* call =
274
+ static_cast<BaseCallData*>(batch->handler_private.extra_arg);
275
+ if (grpc_trace_channel.enabled()) {
276
+ gpr_log(GPR_INFO, "FLUSHER:forward batch via closure: %s",
277
+ grpc_transport_stream_op_batch_string(batch).c_str());
278
+ }
279
+ grpc_call_next_op(call->elem(), batch);
280
+ GRPC_CALL_STACK_UNREF(call->call_stack(), "flusher_batch");
281
+ };
282
+ for (size_t i = 1; i < release_.size(); i++) {
283
+ auto* batch = release_[i];
284
+ if (grpc_trace_channel.enabled()) {
285
+ gpr_log(GPR_INFO, "FLUSHER:queue batch to forward in closure: %s",
286
+ grpc_transport_stream_op_batch_string(release_[i]).c_str());
287
+ }
288
+ batch->handler_private.extra_arg = call_;
289
+ GRPC_CLOSURE_INIT(&batch->handler_private.closure, call_next_op, batch,
290
+ nullptr);
291
+ GRPC_CALL_STACK_REF(call_->call_stack(), "flusher_batch");
292
+ call_closures_.Add(&batch->handler_private.closure, absl::OkStatus(),
293
+ "flusher_batch");
294
+ }
295
+ call_closures_.RunClosuresWithoutYielding(call_->call_combiner());
296
+ if (grpc_trace_channel.enabled()) {
297
+ gpr_log(GPR_INFO, "FLUSHER:forward batch: %s",
298
+ grpc_transport_stream_op_batch_string(release_[0]).c_str());
299
+ }
300
+ grpc_call_next_op(call_->elem(), release_[0]);
301
+ GRPC_CALL_STACK_UNREF(call_->call_stack(), "flusher");
302
+ }
303
+
304
+ ///////////////////////////////////////////////////////////////////////////////
305
+ // BaseCallData::SendMessage
306
+
307
+ const char* BaseCallData::SendMessage::StateString(State state) {
308
+ switch (state) {
309
+ case State::kInitial:
310
+ return "INITIAL";
311
+ case State::kIdle:
312
+ return "IDLE";
313
+ case State::kGotBatchNoPipe:
314
+ return "GOT_BATCH_NO_PIPE";
315
+ case State::kGotBatch:
316
+ return "GOT_BATCH";
317
+ case State::kPushedToPipe:
318
+ return "PUSHED_TO_PIPE";
319
+ case State::kForwardedBatch:
320
+ return "FORWARDED_BATCH";
321
+ case State::kBatchCompleted:
322
+ return "BATCH_COMPLETED";
323
+ case State::kCancelled:
324
+ return "CANCELLED";
325
+ case State::kCancelledButNotYetPolled:
326
+ return "CANCELLED_BUT_NOT_YET_POLLED";
327
+ }
328
+ return "UNKNOWN";
329
+ }
330
+
331
+ void BaseCallData::SendMessage::StartOp(CapturedBatch batch) {
332
+ if (grpc_trace_channel.enabled()) {
333
+ gpr_log(GPR_INFO, "%s SendMessage.StartOp st=%s", base_->LogTag().c_str(),
334
+ StateString(state_));
335
+ }
336
+ switch (state_) {
337
+ case State::kInitial:
338
+ state_ = State::kGotBatchNoPipe;
339
+ break;
340
+ case State::kIdle:
341
+ state_ = State::kGotBatch;
342
+ break;
343
+ case State::kGotBatch:
344
+ case State::kGotBatchNoPipe:
345
+ case State::kForwardedBatch:
346
+ case State::kBatchCompleted:
347
+ case State::kPushedToPipe:
348
+ Crash(absl::StrFormat("ILLEGAL STATE: %s", StateString(state_)));
349
+ case State::kCancelled:
350
+ case State::kCancelledButNotYetPolled:
351
+ return;
352
+ }
353
+ batch_ = batch;
354
+ intercepted_on_complete_ = std::exchange(batch_->on_complete, &on_complete_);
355
+ }
356
+
357
+ template <typename T>
358
+ void BaseCallData::SendMessage::GotPipe(T* pipe_end) {
359
+ if (grpc_trace_channel.enabled()) {
360
+ gpr_log(GPR_INFO, "%s SendMessage.GotPipe st=%s", base_->LogTag().c_str(),
361
+ StateString(state_));
362
+ }
363
+ GPR_ASSERT(pipe_end != nullptr);
364
+ switch (state_) {
365
+ case State::kInitial:
366
+ state_ = State::kIdle;
367
+ Activity::current()->ForceImmediateRepoll();
368
+ break;
369
+ case State::kGotBatchNoPipe:
370
+ state_ = State::kGotBatch;
371
+ Activity::current()->ForceImmediateRepoll();
372
+ break;
373
+ case State::kIdle:
374
+ case State::kGotBatch:
375
+ case State::kForwardedBatch:
376
+ case State::kBatchCompleted:
377
+ case State::kPushedToPipe:
378
+ Crash(absl::StrFormat("ILLEGAL STATE: %s", StateString(state_)));
379
+ case State::kCancelled:
380
+ case State::kCancelledButNotYetPolled:
381
+ return;
382
+ }
383
+ interceptor_->GotPipe(pipe_end);
384
+ }
385
+
386
+ bool BaseCallData::SendMessage::IsIdle() const {
387
+ switch (state_) {
388
+ case State::kInitial:
389
+ case State::kIdle:
390
+ case State::kForwardedBatch:
391
+ case State::kCancelled:
392
+ case State::kCancelledButNotYetPolled:
393
+ return true;
394
+ case State::kGotBatchNoPipe:
395
+ case State::kGotBatch:
396
+ case State::kBatchCompleted:
397
+ case State::kPushedToPipe:
398
+ return false;
399
+ }
400
+ GPR_UNREACHABLE_CODE(return false);
401
+ }
402
+
403
+ void BaseCallData::SendMessage::OnComplete(absl::Status status) {
404
+ Flusher flusher(base_);
405
+ if (grpc_trace_channel.enabled()) {
406
+ gpr_log(GPR_INFO, "%s SendMessage.OnComplete st=%s status=%s",
407
+ base_->LogTag().c_str(), StateString(state_),
408
+ status.ToString().c_str());
409
+ }
410
+ switch (state_) {
411
+ case State::kInitial:
412
+ case State::kIdle:
413
+ case State::kGotBatchNoPipe:
414
+ case State::kPushedToPipe:
415
+ case State::kGotBatch:
416
+ case State::kBatchCompleted:
417
+ Crash(absl::StrFormat("ILLEGAL STATE: %s", StateString(state_)));
418
+ break;
419
+ case State::kCancelled:
420
+ case State::kCancelledButNotYetPolled:
421
+ flusher.AddClosure(intercepted_on_complete_, status,
422
+ "forward after cancel");
423
+ break;
424
+ case State::kForwardedBatch:
425
+ completed_status_ = status;
426
+ state_ = State::kBatchCompleted;
427
+ ScopedContext ctx(base_);
428
+ base_->WakeInsideCombiner(&flusher);
429
+ break;
430
+ }
431
+ }
432
+
433
+ void BaseCallData::SendMessage::Done(const ServerMetadata& metadata,
434
+ Flusher* flusher) {
435
+ if (grpc_trace_channel.enabled()) {
436
+ gpr_log(GPR_INFO, "%s SendMessage.Done st=%s md=%s",
437
+ base_->LogTag().c_str(), StateString(state_),
438
+ metadata.DebugString().c_str());
439
+ }
440
+ switch (state_) {
441
+ case State::kCancelled:
442
+ case State::kCancelledButNotYetPolled:
443
+ break;
444
+ case State::kInitial:
445
+ case State::kIdle:
446
+ case State::kForwardedBatch:
447
+ state_ = State::kCancelledButNotYetPolled;
448
+ break;
449
+ case State::kGotBatchNoPipe:
450
+ case State::kGotBatch: {
451
+ std::string temp;
452
+ batch_.CancelWith(
453
+ absl::Status(
454
+ static_cast<absl::StatusCode>(metadata.get(GrpcStatusMetadata())
455
+ .value_or(GRPC_STATUS_UNKNOWN)),
456
+ metadata.GetStringValue("grpc-message", &temp).value_or("")),
457
+ flusher);
458
+ state_ = State::kCancelledButNotYetPolled;
459
+ } break;
460
+ case State::kBatchCompleted:
461
+ Crash(absl::StrFormat("ILLEGAL STATE: %s", StateString(state_)));
462
+ break;
463
+ case State::kPushedToPipe:
464
+ push_.reset();
465
+ next_.reset();
466
+ state_ = State::kCancelledButNotYetPolled;
467
+ break;
468
+ }
469
+ }
470
+
471
+ void BaseCallData::SendMessage::WakeInsideCombiner(Flusher* flusher,
472
+ bool allow_push_to_pipe) {
473
+ if (grpc_trace_channel.enabled()) {
474
+ gpr_log(GPR_INFO, "%s SendMessage.WakeInsideCombiner st=%s%s",
475
+ base_->LogTag().c_str(), StateString(state_),
476
+ state_ == State::kBatchCompleted
477
+ ? absl::StrCat(" status=", completed_status_.ToString()).c_str()
478
+ : "");
479
+ }
480
+ switch (state_) {
481
+ case State::kInitial:
482
+ case State::kIdle:
483
+ case State::kGotBatchNoPipe:
484
+ case State::kCancelled:
485
+ break;
486
+ case State::kCancelledButNotYetPolled:
487
+ interceptor()->Push()->Close();
488
+ state_ = State::kCancelled;
489
+ break;
490
+ case State::kGotBatch:
491
+ if (allow_push_to_pipe) {
492
+ state_ = State::kPushedToPipe;
493
+ auto message = GetContext<Arena>()->MakePooled<Message>();
494
+ message->payload()->Swap(batch_->payload->send_message.send_message);
495
+ message->mutable_flags() = batch_->payload->send_message.flags;
496
+ push_ = interceptor()->Push()->Push(std::move(message));
497
+ next_.emplace(interceptor()->Pull()->Next());
498
+ } else {
499
+ break;
500
+ }
501
+ ABSL_FALLTHROUGH_INTENDED;
502
+ case State::kPushedToPipe: {
503
+ GPR_ASSERT(push_.has_value());
504
+ auto r_push = (*push_)();
505
+ if (auto* p = r_push.value_if_ready()) {
506
+ if (grpc_trace_channel.enabled()) {
507
+ gpr_log(GPR_INFO,
508
+ "%s SendMessage.WakeInsideCombiner push complete, result=%s",
509
+ base_->LogTag().c_str(), *p ? "true" : "false");
510
+ }
511
+ // We haven't pulled through yet, so this certainly shouldn't succeed.
512
+ GPR_ASSERT(!*p);
513
+ state_ = State::kCancelled;
514
+ batch_.CancelWith(absl::CancelledError(), flusher);
515
+ break;
516
+ }
517
+ GPR_ASSERT(next_.has_value());
518
+ auto r_next = (*next_)();
519
+ if (auto* p = r_next.value_if_ready()) {
520
+ if (grpc_trace_channel.enabled()) {
521
+ gpr_log(GPR_INFO,
522
+ "%s SendMessage.WakeInsideCombiner next complete, "
523
+ "result.has_value=%s",
524
+ base_->LogTag().c_str(), p->has_value() ? "true" : "false");
525
+ }
526
+ GPR_ASSERT(p->has_value());
527
+ batch_->payload->send_message.send_message->Swap((**p)->payload());
528
+ batch_->payload->send_message.flags = (**p)->flags();
529
+ state_ = State::kForwardedBatch;
530
+ batch_.ResumeWith(flusher);
531
+ next_.reset();
532
+ if ((*push_)().ready()) push_.reset();
533
+ }
534
+ } break;
535
+ case State::kForwardedBatch:
536
+ if (push_.has_value() && (*push_)().ready()) {
537
+ push_.reset();
538
+ }
539
+ break;
540
+ case State::kBatchCompleted:
541
+ if (push_.has_value() && (*push_)().pending()) {
542
+ break;
543
+ }
544
+ if (completed_status_.ok()) {
545
+ state_ = State::kIdle;
546
+ Activity::current()->ForceImmediateRepoll();
547
+ } else {
548
+ state_ = State::kCancelled;
549
+ }
550
+ flusher->AddClosure(intercepted_on_complete_, completed_status_,
551
+ "batch_completed");
552
+ break;
553
+ }
554
+ }
555
+
556
+ ///////////////////////////////////////////////////////////////////////////////
557
+ // BaseCallData::ReceiveMessage
558
+
559
+ const char* BaseCallData::ReceiveMessage::StateString(State state) {
560
+ switch (state) {
561
+ case State::kInitial:
562
+ return "INITIAL";
563
+ case State::kIdle:
564
+ return "IDLE";
565
+ case State::kForwardedBatchNoPipe:
566
+ return "FORWARDED_BATCH_NO_PIPE";
567
+ case State::kForwardedBatch:
568
+ return "FORWARDED_BATCH";
569
+ case State::kBatchCompletedNoPipe:
570
+ return "BATCH_COMPLETED_NO_PIPE";
571
+ case State::kBatchCompleted:
572
+ return "BATCH_COMPLETED";
573
+ case State::kPushedToPipe:
574
+ return "PUSHED_TO_PIPE";
575
+ case State::kPulledFromPipe:
576
+ return "PULLED_FROM_PIPE";
577
+ case State::kCancelled:
578
+ return "CANCELLED";
579
+ case State::kCancelledWhilstForwarding:
580
+ return "CANCELLED_WHILST_FORWARDING";
581
+ case State::kCancelledWhilstForwardingNoPipe:
582
+ return "CANCELLED_WHILST_FORWARDING_NO_PIPE";
583
+ case State::kBatchCompletedButCancelled:
584
+ return "BATCH_COMPLETED_BUT_CANCELLED";
585
+ case State::kBatchCompletedButCancelledNoPipe:
586
+ return "BATCH_COMPLETED_BUT_CANCELLED_NO_PIPE";
587
+ case State::kCancelledWhilstIdle:
588
+ return "CANCELLED_WHILST_IDLE";
589
+ case State::kCompletedWhilePulledFromPipe:
590
+ return "COMPLETED_WHILE_PULLED_FROM_PIPE";
591
+ case State::kCompletedWhilePushedToPipe:
592
+ return "COMPLETED_WHILE_PUSHED_TO_PIPE";
593
+ case State::kCompletedWhileBatchCompleted:
594
+ return "COMPLETED_WHILE_BATCH_COMPLETED";
595
+ }
596
+ return "UNKNOWN";
597
+ }
598
+
599
+ void BaseCallData::ReceiveMessage::StartOp(CapturedBatch& batch) {
600
+ if (grpc_trace_channel.enabled()) {
601
+ gpr_log(GPR_INFO, "%s ReceiveMessage.StartOp st=%s",
602
+ base_->LogTag().c_str(), StateString(state_));
603
+ }
604
+ switch (state_) {
605
+ case State::kInitial:
606
+ state_ = State::kForwardedBatchNoPipe;
607
+ break;
608
+ case State::kIdle:
609
+ state_ = State::kForwardedBatch;
610
+ break;
611
+ case State::kCancelledWhilstForwarding:
612
+ case State::kCancelledWhilstForwardingNoPipe:
613
+ case State::kBatchCompletedButCancelled:
614
+ case State::kBatchCompletedButCancelledNoPipe:
615
+ case State::kForwardedBatch:
616
+ case State::kForwardedBatchNoPipe:
617
+ case State::kBatchCompleted:
618
+ case State::kBatchCompletedNoPipe:
619
+ case State::kCompletedWhileBatchCompleted:
620
+ case State::kPushedToPipe:
621
+ case State::kPulledFromPipe:
622
+ case State::kCompletedWhilePulledFromPipe:
623
+ case State::kCompletedWhilePushedToPipe:
624
+ Crash(absl::StrFormat("ILLEGAL STATE: %s", StateString(state_)));
625
+ case State::kCancelledWhilstIdle:
626
+ case State::kCancelled:
627
+ return;
628
+ }
629
+ intercepted_slice_buffer_ = batch->payload->recv_message.recv_message;
630
+ intercepted_flags_ = batch->payload->recv_message.flags;
631
+ if (intercepted_flags_ == nullptr) {
632
+ intercepted_flags_ = &scratch_flags_;
633
+ *intercepted_flags_ = 0;
634
+ }
635
+ intercepted_on_complete_ = std::exchange(
636
+ batch->payload->recv_message.recv_message_ready, &on_complete_);
637
+ }
638
+
639
+ template <typename T>
640
+ void BaseCallData::ReceiveMessage::GotPipe(T* pipe_end) {
641
+ if (grpc_trace_channel.enabled()) {
642
+ gpr_log(GPR_INFO, "%s ReceiveMessage.GotPipe st=%s",
643
+ base_->LogTag().c_str(), StateString(state_));
644
+ }
645
+ switch (state_) {
646
+ case State::kInitial:
647
+ state_ = State::kIdle;
648
+ break;
649
+ case State::kForwardedBatchNoPipe:
650
+ state_ = State::kForwardedBatch;
651
+ break;
652
+ case State::kBatchCompletedNoPipe:
653
+ state_ = State::kBatchCompleted;
654
+ Activity::current()->ForceImmediateRepoll();
655
+ break;
656
+ case State::kIdle:
657
+ case State::kForwardedBatch:
658
+ case State::kBatchCompleted:
659
+ case State::kPushedToPipe:
660
+ case State::kPulledFromPipe:
661
+ case State::kCompletedWhilePulledFromPipe:
662
+ case State::kCompletedWhilePushedToPipe:
663
+ case State::kCompletedWhileBatchCompleted:
664
+ case State::kCancelledWhilstForwarding:
665
+ case State::kCancelledWhilstForwardingNoPipe:
666
+ case State::kCancelledWhilstIdle:
667
+ case State::kBatchCompletedButCancelled:
668
+ case State::kBatchCompletedButCancelledNoPipe:
669
+ Crash(absl::StrFormat("ILLEGAL STATE: %s", StateString(state_)));
670
+ case State::kCancelled:
671
+ return;
672
+ }
673
+ interceptor()->GotPipe(pipe_end);
69
674
  }
70
675
 
71
- void BaseCallData::Drop() { GRPC_CALL_STACK_UNREF(call_stack_, "waker"); }
676
+ void BaseCallData::ReceiveMessage::OnComplete(absl::Status status) {
677
+ if (grpc_trace_channel.enabled()) {
678
+ gpr_log(GPR_INFO, "%s ReceiveMessage.OnComplete st=%s status=%s",
679
+ base_->LogTag().c_str(), StateString(state_),
680
+ status.ToString().c_str());
681
+ }
682
+ switch (state_) {
683
+ case State::kInitial:
684
+ case State::kIdle:
685
+ case State::kPushedToPipe:
686
+ case State::kPulledFromPipe:
687
+ case State::kBatchCompleted:
688
+ case State::kCompletedWhileBatchCompleted:
689
+ case State::kBatchCompletedNoPipe:
690
+ case State::kCancelled:
691
+ case State::kBatchCompletedButCancelled:
692
+ case State::kBatchCompletedButCancelledNoPipe:
693
+ case State::kCancelledWhilstIdle:
694
+ case State::kCompletedWhilePulledFromPipe:
695
+ case State::kCompletedWhilePushedToPipe:
696
+ Crash(absl::StrFormat("ILLEGAL STATE: %s", StateString(state_)));
697
+ case State::kForwardedBatchNoPipe:
698
+ state_ = State::kBatchCompletedNoPipe;
699
+ return;
700
+ case State::kForwardedBatch:
701
+ state_ = State::kBatchCompleted;
702
+ break;
703
+ case State::kCancelledWhilstForwarding:
704
+ state_ = State::kBatchCompletedButCancelled;
705
+ break;
706
+ case State::kCancelledWhilstForwardingNoPipe:
707
+ state_ = State::kBatchCompletedButCancelledNoPipe;
708
+ break;
709
+ }
710
+ completed_status_ = status;
711
+ Flusher flusher(base_);
712
+ ScopedContext ctx(base_);
713
+ base_->WakeInsideCombiner(&flusher);
714
+ }
715
+
716
+ void BaseCallData::ReceiveMessage::Done(const ServerMetadata& metadata,
717
+ Flusher* flusher) {
718
+ if (grpc_trace_channel.enabled()) {
719
+ gpr_log(GPR_INFO, "%s ReceiveMessage.Done st=%s md=%s",
720
+ base_->LogTag().c_str(), StateString(state_),
721
+ metadata.DebugString().c_str());
722
+ }
723
+ switch (state_) {
724
+ case State::kInitial:
725
+ state_ = State::kCancelled;
726
+ break;
727
+ case State::kIdle:
728
+ state_ = State::kCancelledWhilstIdle;
729
+ break;
730
+ case State::kForwardedBatch:
731
+ state_ = State::kCancelledWhilstForwarding;
732
+ break;
733
+ case State::kForwardedBatchNoPipe:
734
+ state_ = State::kCancelledWhilstForwardingNoPipe;
735
+ break;
736
+ case State::kCompletedWhileBatchCompleted:
737
+ case State::kBatchCompleted:
738
+ state_ = State::kCompletedWhileBatchCompleted;
739
+ break;
740
+ case State::kCompletedWhilePulledFromPipe:
741
+ case State::kCompletedWhilePushedToPipe:
742
+ case State::kPulledFromPipe:
743
+ case State::kPushedToPipe: {
744
+ auto status_code =
745
+ metadata.get(GrpcStatusMetadata()).value_or(GRPC_STATUS_UNKNOWN);
746
+ if (status_code == GRPC_STATUS_OK) {
747
+ if (state_ == State::kCompletedWhilePulledFromPipe ||
748
+ state_ == State::kPulledFromPipe) {
749
+ state_ = State::kCompletedWhilePulledFromPipe;
750
+ } else {
751
+ state_ = State::kCompletedWhilePushedToPipe;
752
+ }
753
+ } else {
754
+ push_.reset();
755
+ next_.reset();
756
+ flusher->AddClosure(intercepted_on_complete_,
757
+ StatusFromMetadata(metadata), "recv_message_done");
758
+ state_ = State::kCancelled;
759
+ }
760
+ } break;
761
+ case State::kBatchCompletedNoPipe:
762
+ case State::kBatchCompletedButCancelled:
763
+ case State::kBatchCompletedButCancelledNoPipe:
764
+ Crash(absl::StrFormat("ILLEGAL STATE: %s", StateString(state_)));
765
+ case State::kCancelledWhilstIdle:
766
+ case State::kCancelledWhilstForwarding:
767
+ case State::kCancelledWhilstForwardingNoPipe:
768
+ case State::kCancelled:
769
+ break;
770
+ }
771
+ }
772
+
773
+ void BaseCallData::ReceiveMessage::WakeInsideCombiner(Flusher* flusher,
774
+ bool allow_push_to_pipe) {
775
+ if (grpc_trace_channel.enabled()) {
776
+ gpr_log(GPR_INFO,
777
+ "%s ReceiveMessage.WakeInsideCombiner st=%s push?=%s next?=%s "
778
+ "allow_push_to_pipe=%s",
779
+ base_->LogTag().c_str(), StateString(state_),
780
+ push_.has_value() ? "yes" : "no", next_.has_value() ? "yes" : "no",
781
+ allow_push_to_pipe ? "yes" : "no");
782
+ }
783
+ switch (state_) {
784
+ case State::kInitial:
785
+ case State::kIdle:
786
+ case State::kForwardedBatchNoPipe:
787
+ case State::kForwardedBatch:
788
+ case State::kCancelled:
789
+ case State::kCancelledWhilstForwarding:
790
+ case State::kCancelledWhilstForwardingNoPipe:
791
+ case State::kBatchCompletedNoPipe:
792
+ break;
793
+ case State::kCancelledWhilstIdle:
794
+ interceptor()->Push()->Close();
795
+ state_ = State::kCancelled;
796
+ break;
797
+ case State::kBatchCompletedButCancelled:
798
+ case State::kCompletedWhileBatchCompleted:
799
+ interceptor()->Push()->Close();
800
+ state_ = State::kCancelled;
801
+ flusher->AddClosure(std::exchange(intercepted_on_complete_, nullptr),
802
+ completed_status_, "recv_message");
803
+ break;
804
+ case State::kBatchCompletedButCancelledNoPipe:
805
+ state_ = State::kCancelled;
806
+ flusher->AddClosure(std::exchange(intercepted_on_complete_, nullptr),
807
+ completed_status_, "recv_message");
808
+ break;
809
+ case State::kBatchCompleted:
810
+ if (completed_status_.ok() && intercepted_slice_buffer_->has_value()) {
811
+ if (!allow_push_to_pipe) break;
812
+ if (state_ == State::kBatchCompleted) {
813
+ state_ = State::kPushedToPipe;
814
+ } else {
815
+ state_ = State::kCompletedWhilePushedToPipe;
816
+ }
817
+ auto message = GetContext<Arena>()->MakePooled<Message>();
818
+ message->payload()->Swap(&**intercepted_slice_buffer_);
819
+ message->mutable_flags() = *intercepted_flags_;
820
+ push_ = interceptor()->Push()->Push(std::move(message));
821
+ next_.emplace(interceptor()->Pull()->Next());
822
+ } else {
823
+ interceptor()->Push()->Close();
824
+ state_ = State::kCancelled;
825
+ flusher->AddClosure(std::exchange(intercepted_on_complete_, nullptr),
826
+ completed_status_, "recv_message");
827
+ break;
828
+ }
829
+ GPR_ASSERT(state_ == State::kPushedToPipe ||
830
+ state_ == State::kCompletedWhilePushedToPipe);
831
+ ABSL_FALLTHROUGH_INTENDED;
832
+ case State::kCompletedWhilePushedToPipe:
833
+ case State::kPushedToPipe: {
834
+ GPR_ASSERT(push_.has_value());
835
+ auto r_push = (*push_)();
836
+ if (auto* p = r_push.value_if_ready()) {
837
+ if (grpc_trace_channel.enabled()) {
838
+ gpr_log(GPR_INFO,
839
+ "%s ReceiveMessage.WakeInsideCombiner push complete: %s",
840
+ base_->LogTag().c_str(), *p ? "true" : "false");
841
+ }
842
+ // We haven't pulled through yet, so this certainly shouldn't succeed.
843
+ GPR_ASSERT(!*p);
844
+ state_ = State::kCancelled;
845
+ break;
846
+ }
847
+ GPR_ASSERT(next_.has_value());
848
+ auto r_next = (*next_)();
849
+ if (auto* p = r_next.value_if_ready()) {
850
+ next_.reset();
851
+ if (p->has_value()) {
852
+ *intercepted_slice_buffer_ = std::move(*(**p)->payload());
853
+ *intercepted_flags_ = (**p)->flags();
854
+ if (state_ == State::kCompletedWhilePushedToPipe) {
855
+ state_ = State::kCompletedWhilePulledFromPipe;
856
+ } else {
857
+ state_ = State::kPulledFromPipe;
858
+ }
859
+ } else {
860
+ *intercepted_slice_buffer_ = absl::nullopt;
861
+ *intercepted_flags_ = 0;
862
+ state_ = State::kCancelled;
863
+ flusher->AddClosure(
864
+ std::exchange(intercepted_on_complete_, nullptr),
865
+ p->cancelled() ? absl::CancelledError() : absl::OkStatus(),
866
+ "recv_message");
867
+ }
868
+ if (grpc_trace_channel.enabled()) {
869
+ gpr_log(GPR_INFO,
870
+ "%s ReceiveMessage.WakeInsideCombiner next complete: %s "
871
+ "new_state=%s",
872
+ base_->LogTag().c_str(),
873
+ p->has_value() ? "got message" : "end of stream",
874
+ StateString(state_));
875
+ }
876
+ }
877
+ if (state_ != State::kPulledFromPipe &&
878
+ state_ != State::kCompletedWhilePulledFromPipe) {
879
+ break;
880
+ }
881
+ }
882
+ ABSL_FALLTHROUGH_INTENDED;
883
+ case State::kCompletedWhilePulledFromPipe:
884
+ case State::kPulledFromPipe: {
885
+ GPR_ASSERT(push_.has_value());
886
+ if ((*push_)().ready()) {
887
+ if (grpc_trace_channel.enabled()) {
888
+ gpr_log(GPR_INFO,
889
+ "%s ReceiveMessage.WakeInsideCombiner push complete",
890
+ base_->LogTag().c_str());
891
+ }
892
+ if (state_ == State::kCompletedWhilePulledFromPipe) {
893
+ interceptor()->Push()->Close();
894
+ state_ = State::kCancelled;
895
+ } else {
896
+ state_ = State::kIdle;
897
+ }
898
+ push_.reset();
899
+ flusher->AddClosure(std::exchange(intercepted_on_complete_, nullptr),
900
+ absl::OkStatus(), "recv_message");
901
+ }
902
+ break;
903
+ }
904
+ }
905
+ }
72
906
 
73
907
  ///////////////////////////////////////////////////////////////////////////////
74
908
  // ClientCallData
@@ -78,34 +912,84 @@ struct ClientCallData::RecvInitialMetadata final {
78
912
  // Initial state; no op seen
79
913
  kInitial,
80
914
  // No op seen, but we have a latch that would like to modify it when we do
81
- kGotLatch,
915
+ kGotPipe,
82
916
  // Responded to trailing metadata prior to getting a recv_initial_metadata
83
917
  kRespondedToTrailingMetadataPriorToHook,
84
918
  // Hooked, no latch yet
85
- kHookedWaitingForLatch,
919
+ kHookedWaitingForPipe,
86
920
  // Hooked, latch seen
87
- kHookedAndGotLatch,
921
+ kHookedAndGotPipe,
88
922
  // Got the callback, haven't set latch yet
89
- kCompleteWaitingForLatch,
923
+ kCompleteWaitingForPipe,
90
924
  // Got the callback and got the latch
91
- kCompleteAndGotLatch,
925
+ kCompleteAndGotPipe,
92
926
  // Got the callback and set the latch
93
- kCompleteAndSetLatch,
927
+ kCompleteAndPushedToPipe,
94
928
  // Called the original callback
95
929
  kResponded,
930
+ // Called the original callback with an error: still need to set the latch
931
+ kRespondedButNeedToClosePipe,
96
932
  };
97
933
 
98
934
  State state = kInitial;
99
935
  grpc_closure* original_on_ready = nullptr;
100
936
  grpc_closure on_ready;
101
937
  grpc_metadata_batch* metadata = nullptr;
102
- Latch<ServerMetadata*>* server_initial_metadata_publisher = nullptr;
938
+ PipeSender<ServerMetadataHandle>* server_initial_metadata_publisher = nullptr;
939
+ absl::optional<PipeSender<ServerMetadataHandle>::PushType> metadata_push_;
940
+ absl::optional<PipeReceiverNextType<ServerMetadataHandle>> metadata_next_;
941
+
942
+ static const char* StateString(State state) {
943
+ switch (state) {
944
+ case kInitial:
945
+ return "INITIAL";
946
+ case kGotPipe:
947
+ return "GOT_PIPE";
948
+ case kRespondedToTrailingMetadataPriorToHook:
949
+ return "RESPONDED_TO_TRAILING_METADATA_PRIOR_TO_HOOK";
950
+ case kHookedWaitingForPipe:
951
+ return "HOOKED_WAITING_FOR_PIPE";
952
+ case kHookedAndGotPipe:
953
+ return "HOOKED_AND_GOT_PIPE";
954
+ case kCompleteWaitingForPipe:
955
+ return "COMPLETE_WAITING_FOR_PIPE";
956
+ case kCompleteAndGotPipe:
957
+ return "COMPLETE_AND_GOT_PIPE";
958
+ case kCompleteAndPushedToPipe:
959
+ return "COMPLETE_AND_PUSHED_TO_PIPE";
960
+ case kResponded:
961
+ return "RESPONDED";
962
+ case kRespondedButNeedToClosePipe:
963
+ return "RESPONDED_BUT_NEED_TO_CLOSE_PIPE";
964
+ }
965
+ return "UNKNOWN";
966
+ }
967
+
968
+ bool AllowRecvMessage() const {
969
+ switch (state) {
970
+ case kInitial:
971
+ case kGotPipe:
972
+ case kHookedWaitingForPipe:
973
+ case kHookedAndGotPipe:
974
+ case kCompleteWaitingForPipe:
975
+ case kCompleteAndGotPipe:
976
+ case kCompleteAndPushedToPipe:
977
+ case kRespondedToTrailingMetadataPriorToHook:
978
+ return false;
979
+ case kResponded:
980
+ case kRespondedButNeedToClosePipe:
981
+ return true;
982
+ }
983
+ GPR_UNREACHABLE_CODE(return false);
984
+ }
103
985
  };
104
986
 
105
987
  class ClientCallData::PollContext {
106
988
  public:
107
- explicit PollContext(ClientCallData* self) : self_(self) {
989
+ explicit PollContext(ClientCallData* self, Flusher* flusher)
990
+ : self_(self), flusher_(flusher) {
108
991
  GPR_ASSERT(self_->poll_ctx_ == nullptr);
992
+
109
993
  self_->poll_ctx_ = this;
110
994
  scoped_activity_.Init(self_);
111
995
  have_scoped_activity_ = true;
@@ -115,38 +999,79 @@ class ClientCallData::PollContext {
115
999
  PollContext& operator=(const PollContext&) = delete;
116
1000
 
117
1001
  void Run() {
1002
+ GPR_DEBUG_ASSERT(HasContext<Arena>());
1003
+ if (grpc_trace_channel.enabled()) {
1004
+ gpr_log(GPR_INFO, "%s ClientCallData.PollContext.Run %s",
1005
+ self_->LogTag().c_str(), self_->DebugString().c_str());
1006
+ }
118
1007
  GPR_ASSERT(have_scoped_activity_);
119
1008
  repoll_ = false;
120
- if (self_->server_initial_metadata_latch() != nullptr) {
1009
+ if (self_->send_message() != nullptr) {
1010
+ self_->send_message()->WakeInsideCombiner(flusher_, true);
1011
+ }
1012
+ if (self_->receive_message() != nullptr) {
1013
+ self_->receive_message()->WakeInsideCombiner(
1014
+ flusher_, self_->recv_initial_metadata_ == nullptr
1015
+ ? true
1016
+ : self_->recv_initial_metadata_->AllowRecvMessage());
1017
+ }
1018
+ if (self_->server_initial_metadata_pipe() != nullptr) {
1019
+ if (self_->recv_initial_metadata_->metadata_push_.has_value()) {
1020
+ if ((*self_->recv_initial_metadata_->metadata_push_)().ready()) {
1021
+ self_->recv_initial_metadata_->metadata_push_.reset();
1022
+ }
1023
+ }
121
1024
  switch (self_->recv_initial_metadata_->state) {
122
1025
  case RecvInitialMetadata::kInitial:
123
- case RecvInitialMetadata::kGotLatch:
124
- case RecvInitialMetadata::kHookedWaitingForLatch:
125
- case RecvInitialMetadata::kHookedAndGotLatch:
126
- case RecvInitialMetadata::kCompleteWaitingForLatch:
1026
+ case RecvInitialMetadata::kGotPipe:
1027
+ case RecvInitialMetadata::kHookedWaitingForPipe:
1028
+ case RecvInitialMetadata::kHookedAndGotPipe:
1029
+ case RecvInitialMetadata::kCompleteWaitingForPipe:
127
1030
  case RecvInitialMetadata::kResponded:
128
1031
  case RecvInitialMetadata::kRespondedToTrailingMetadataPriorToHook:
129
1032
  break;
130
- case RecvInitialMetadata::kCompleteAndGotLatch:
1033
+ case RecvInitialMetadata::kRespondedButNeedToClosePipe:
1034
+ self_->recv_initial_metadata_->server_initial_metadata_publisher
1035
+ ->Close();
131
1036
  self_->recv_initial_metadata_->state =
132
- RecvInitialMetadata::kCompleteAndSetLatch;
133
- self_->recv_initial_metadata_->server_initial_metadata_publisher->Set(
134
- self_->recv_initial_metadata_->metadata);
1037
+ RecvInitialMetadata::kResponded;
1038
+ break;
1039
+ case RecvInitialMetadata::kCompleteAndGotPipe:
1040
+ self_->recv_initial_metadata_->state =
1041
+ RecvInitialMetadata::kCompleteAndPushedToPipe;
1042
+ GPR_ASSERT(
1043
+ !self_->recv_initial_metadata_->metadata_push_.has_value());
1044
+ GPR_ASSERT(
1045
+ !self_->recv_initial_metadata_->metadata_next_.has_value());
1046
+ self_->recv_initial_metadata_->metadata_push_.emplace(
1047
+ self_->recv_initial_metadata_->server_initial_metadata_publisher
1048
+ ->Push(ServerMetadataHandle(
1049
+ self_->recv_initial_metadata_->metadata,
1050
+ Arena::PooledDeleter(nullptr))));
1051
+ repoll_ = true; // ensure Push() gets polled.
1052
+ self_->recv_initial_metadata_->metadata_next_.emplace(
1053
+ self_->server_initial_metadata_pipe()->receiver.Next());
135
1054
  ABSL_FALLTHROUGH_INTENDED;
136
- case RecvInitialMetadata::kCompleteAndSetLatch: {
137
- Poll<ServerMetadata**> p =
138
- self_->server_initial_metadata_latch()->Wait()();
139
- if (ServerMetadata*** ppp = absl::get_if<ServerMetadata**>(&p)) {
140
- ServerMetadata* md = **ppp;
141
- if (self_->recv_initial_metadata_->metadata != md) {
142
- *self_->recv_initial_metadata_->metadata = std::move(*md);
1055
+ case RecvInitialMetadata::kCompleteAndPushedToPipe: {
1056
+ GPR_ASSERT(self_->recv_initial_metadata_->metadata_next_.has_value());
1057
+ Poll<NextResult<ServerMetadataHandle>> p =
1058
+ (*self_->recv_initial_metadata_->metadata_next_)();
1059
+ if (NextResult<ServerMetadataHandle>* nr = p.value_if_ready()) {
1060
+ if (nr->has_value()) {
1061
+ ServerMetadataHandle md = std::move(nr->value());
1062
+ if (self_->recv_initial_metadata_->metadata != md.get()) {
1063
+ *self_->recv_initial_metadata_->metadata = std::move(*md);
1064
+ }
1065
+ } else {
1066
+ self_->recv_initial_metadata_->metadata->Clear();
143
1067
  }
144
1068
  self_->recv_initial_metadata_->state =
145
1069
  RecvInitialMetadata::kResponded;
146
- call_closures_.Add(
147
- absl::exchange(self_->recv_initial_metadata_->original_on_ready,
148
- nullptr),
149
- GRPC_ERROR_NONE,
1070
+ repoll_ = true;
1071
+ flusher_->AddClosure(
1072
+ std::exchange(self_->recv_initial_metadata_->original_on_ready,
1073
+ nullptr),
1074
+ absl::OkStatus(),
150
1075
  "wake_inside_combiner:recv_initial_metadata_ready");
151
1076
  }
152
1077
  } break;
@@ -161,116 +1086,122 @@ class ClientCallData::PollContext {
161
1086
  case SendInitialState::kForwarded: {
162
1087
  // Poll the promise once since we're waiting for it.
163
1088
  Poll<ServerMetadataHandle> poll = self_->promise_();
164
- if (auto* r = absl::get_if<ServerMetadataHandle>(&poll)) {
165
- auto* md = UnwrapMetadata(std::move(*r));
166
- bool destroy_md = true;
1089
+ if (grpc_trace_channel.enabled()) {
1090
+ gpr_log(GPR_INFO, "%s ClientCallData.PollContext.Run: poll=%s",
1091
+ self_->LogTag().c_str(),
1092
+ PollToString(poll, [](const ServerMetadataHandle& h) {
1093
+ return h->DebugString();
1094
+ }).c_str());
1095
+ }
1096
+ if (auto* r = poll.value_if_ready()) {
1097
+ auto md = std::move(*r);
1098
+ if (self_->send_message() != nullptr) {
1099
+ self_->send_message()->Done(*md, flusher_);
1100
+ }
1101
+ if (self_->receive_message() != nullptr) {
1102
+ self_->receive_message()->Done(*md, flusher_);
1103
+ }
167
1104
  if (self_->recv_trailing_state_ == RecvTrailingState::kComplete) {
168
- if (self_->recv_trailing_metadata_ != md) {
1105
+ if (self_->recv_trailing_metadata_ != md.get()) {
169
1106
  *self_->recv_trailing_metadata_ = std::move(*md);
170
- } else {
171
- destroy_md = false;
172
1107
  }
173
1108
  self_->recv_trailing_state_ = RecvTrailingState::kResponded;
174
- call_closures_.Add(
175
- absl::exchange(self_->original_recv_trailing_metadata_ready_,
176
- nullptr),
177
- GRPC_ERROR_NONE, "wake_inside_combiner:recv_trailing_ready:1");
1109
+ flusher_->AddClosure(
1110
+ std::exchange(self_->original_recv_trailing_metadata_ready_,
1111
+ nullptr),
1112
+ absl::OkStatus(), "wake_inside_combiner:recv_trailing_ready:1");
178
1113
  if (self_->recv_initial_metadata_ != nullptr) {
179
1114
  switch (self_->recv_initial_metadata_->state) {
180
1115
  case RecvInitialMetadata::kInitial:
181
- case RecvInitialMetadata::kGotLatch:
1116
+ case RecvInitialMetadata::kGotPipe:
182
1117
  self_->recv_initial_metadata_->state = RecvInitialMetadata::
183
1118
  kRespondedToTrailingMetadataPriorToHook;
184
1119
  break;
185
1120
  case RecvInitialMetadata::
186
1121
  kRespondedToTrailingMetadataPriorToHook:
187
- abort(); // not reachable
1122
+ case RecvInitialMetadata::kRespondedButNeedToClosePipe:
1123
+ Crash(absl::StrFormat("ILLEGAL STATE: %s",
1124
+ RecvInitialMetadata::StateString(
1125
+ self_->recv_initial_metadata_
1126
+ ->state))); // not reachable
188
1127
  break;
189
- case RecvInitialMetadata::kHookedWaitingForLatch:
190
- case RecvInitialMetadata::kHookedAndGotLatch:
1128
+ case RecvInitialMetadata::kHookedWaitingForPipe:
1129
+ case RecvInitialMetadata::kHookedAndGotPipe:
191
1130
  case RecvInitialMetadata::kResponded:
192
- case RecvInitialMetadata::kCompleteAndGotLatch:
193
- case RecvInitialMetadata::kCompleteAndSetLatch:
1131
+ case RecvInitialMetadata::kCompleteAndGotPipe:
1132
+ case RecvInitialMetadata::kCompleteAndPushedToPipe:
194
1133
  break;
195
- case RecvInitialMetadata::kCompleteWaitingForLatch:
1134
+ case RecvInitialMetadata::kCompleteWaitingForPipe:
196
1135
  self_->recv_initial_metadata_->state =
197
1136
  RecvInitialMetadata::kResponded;
198
- call_closures_.Add(
199
- absl::exchange(
1137
+ flusher_->AddClosure(
1138
+ std::exchange(
200
1139
  self_->recv_initial_metadata_->original_on_ready,
201
1140
  nullptr),
202
- GRPC_ERROR_CANCELLED,
1141
+ absl::CancelledError(),
203
1142
  "wake_inside_combiner:recv_initial_metadata_ready");
204
1143
  }
205
1144
  }
206
1145
  } else {
207
- GPR_ASSERT(*md->get_pointer(GrpcStatusMetadata()) !=
208
- GRPC_STATUS_OK);
209
- grpc_error_handle error = grpc_error_set_int(
210
- GRPC_ERROR_CREATE_FROM_STATIC_STRING(
211
- "early return from promise based filter"),
212
- GRPC_ERROR_INT_GRPC_STATUS,
213
- *md->get_pointer(GrpcStatusMetadata()));
214
- if (auto* message = md->get_pointer(GrpcMessageMetadata())) {
215
- error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE,
216
- message->as_string_view());
217
- }
218
- GRPC_ERROR_UNREF(self_->cancelled_error_);
219
- self_->cancelled_error_ = GRPC_ERROR_REF(error);
1146
+ self_->cancelled_error_ = StatusFromMetadata(*md);
1147
+ GPR_ASSERT(!self_->cancelled_error_.ok());
220
1148
  if (self_->recv_initial_metadata_ != nullptr) {
221
1149
  switch (self_->recv_initial_metadata_->state) {
222
1150
  case RecvInitialMetadata::kInitial:
223
- case RecvInitialMetadata::kGotLatch:
1151
+ case RecvInitialMetadata::kGotPipe:
224
1152
  self_->recv_initial_metadata_->state = RecvInitialMetadata::
225
1153
  kRespondedToTrailingMetadataPriorToHook;
226
1154
  break;
227
- case RecvInitialMetadata::kHookedWaitingForLatch:
228
- case RecvInitialMetadata::kHookedAndGotLatch:
1155
+ case RecvInitialMetadata::kHookedWaitingForPipe:
1156
+ case RecvInitialMetadata::kHookedAndGotPipe:
229
1157
  case RecvInitialMetadata::kResponded:
230
1158
  break;
231
1159
  case RecvInitialMetadata::
232
1160
  kRespondedToTrailingMetadataPriorToHook:
233
- abort(); // not reachable
1161
+ case RecvInitialMetadata::kRespondedButNeedToClosePipe:
1162
+ Crash(absl::StrFormat("ILLEGAL STATE: %s",
1163
+ RecvInitialMetadata::StateString(
1164
+ self_->recv_initial_metadata_
1165
+ ->state))); // not reachable
234
1166
  break;
235
- case RecvInitialMetadata::kCompleteWaitingForLatch:
236
- case RecvInitialMetadata::kCompleteAndGotLatch:
237
- case RecvInitialMetadata::kCompleteAndSetLatch:
1167
+ case RecvInitialMetadata::kCompleteWaitingForPipe:
1168
+ case RecvInitialMetadata::kCompleteAndGotPipe:
1169
+ case RecvInitialMetadata::kCompleteAndPushedToPipe:
238
1170
  self_->recv_initial_metadata_->state =
239
1171
  RecvInitialMetadata::kResponded;
240
- call_closures_.Add(
241
- absl::exchange(
1172
+ flusher_->AddClosure(
1173
+ std::exchange(
242
1174
  self_->recv_initial_metadata_->original_on_ready,
243
1175
  nullptr),
244
- GRPC_ERROR_REF(error),
1176
+ self_->cancelled_error_,
245
1177
  "wake_inside_combiner:recv_initial_metadata_ready");
246
1178
  }
247
1179
  }
248
1180
  if (self_->send_initial_state_ == SendInitialState::kQueued) {
249
1181
  self_->send_initial_state_ = SendInitialState::kCancelled;
250
- cancel_send_initial_metadata_error_ = error;
1182
+ self_->send_initial_metadata_batch_.CancelWith(
1183
+ self_->cancelled_error_, flusher_);
251
1184
  } else {
252
1185
  GPR_ASSERT(
253
1186
  self_->recv_trailing_state_ == RecvTrailingState::kInitial ||
254
1187
  self_->recv_trailing_state_ == RecvTrailingState::kForwarded);
255
- self_->call_combiner()->Cancel(GRPC_ERROR_REF(error));
256
- forward_batch_ =
257
- grpc_make_transport_stream_op(GRPC_CLOSURE_CREATE(
258
- [](void* p, grpc_error_handle) {
259
- GRPC_CALL_COMBINER_STOP(static_cast<CallCombiner*>(p),
260
- "finish_cancel");
261
- },
262
- self_->call_combiner(), nullptr));
263
- forward_batch_->cancel_stream = true;
264
- forward_batch_->payload->cancel_stream.cancel_error = error;
1188
+ self_->call_combiner()->Cancel(self_->cancelled_error_);
1189
+ CapturedBatch b(grpc_make_transport_stream_op(GRPC_CLOSURE_CREATE(
1190
+ [](void* p, grpc_error_handle) {
1191
+ GRPC_CALL_COMBINER_STOP(static_cast<CallCombiner*>(p),
1192
+ "finish_cancel");
1193
+ },
1194
+ self_->call_combiner(), nullptr)));
1195
+ b->cancel_stream = true;
1196
+ b->payload->cancel_stream.cancel_error = self_->cancelled_error_;
1197
+ b.ResumeWith(flusher_);
265
1198
  }
1199
+ self_->cancelling_metadata_ = std::move(md);
266
1200
  self_->recv_trailing_state_ = RecvTrailingState::kCancelled;
267
1201
  }
268
- if (destroy_md) {
269
- md->~grpc_metadata_batch();
270
- }
1202
+ self_->promise_ = ArenaPromise<ServerMetadataHandle>();
271
1203
  scoped_activity_.Destroy();
272
1204
  have_scoped_activity_ = false;
273
- self_->promise_ = ArenaPromise<ServerMetadataHandle>();
274
1205
  }
275
1206
  } break;
276
1207
  case SendInitialState::kInitial:
@@ -280,10 +1211,10 @@ class ClientCallData::PollContext {
280
1211
  // promise transition).
281
1212
  if (self_->recv_trailing_state_ == RecvTrailingState::kComplete) {
282
1213
  self_->recv_trailing_state_ = RecvTrailingState::kResponded;
283
- call_closures_.Add(
284
- absl::exchange(self_->original_recv_trailing_metadata_ready_,
285
- nullptr),
286
- GRPC_ERROR_NONE, "wake_inside_combiner:recv_trailing_ready:2");
1214
+ flusher_->AddClosure(
1215
+ std::exchange(self_->original_recv_trailing_metadata_ready_,
1216
+ nullptr),
1217
+ absl::OkStatus(), "wake_inside_combiner:recv_trailing_ready:2");
287
1218
  }
288
1219
  break;
289
1220
  }
@@ -292,95 +1223,65 @@ class ClientCallData::PollContext {
292
1223
  ~PollContext() {
293
1224
  self_->poll_ctx_ = nullptr;
294
1225
  if (have_scoped_activity_) scoped_activity_.Destroy();
295
- GRPC_CALL_STACK_REF(self_->call_stack(), "finish_poll");
296
- bool in_combiner = true;
297
- if (call_closures_.size() != 0) {
298
- if (forward_batch_ != nullptr) {
299
- call_closures_.RunClosuresWithoutYielding(self_->call_combiner());
300
- } else {
301
- in_combiner = false;
302
- call_closures_.RunClosures(self_->call_combiner());
303
- }
304
- }
305
- if (forward_batch_ != nullptr) {
306
- GPR_ASSERT(in_combiner);
307
- in_combiner = false;
308
- forward_send_initial_metadata_ = false;
309
- grpc_call_next_op(self_->elem(), forward_batch_);
310
- }
311
- if (cancel_send_initial_metadata_error_ != GRPC_ERROR_NONE) {
312
- GPR_ASSERT(in_combiner);
313
- forward_send_initial_metadata_ = false;
314
- in_combiner = false;
315
- grpc_transport_stream_op_batch_finish_with_failure(
316
- absl::exchange(self_->send_initial_metadata_batch_, nullptr),
317
- cancel_send_initial_metadata_error_, self_->call_combiner());
318
- }
319
- if (absl::exchange(forward_send_initial_metadata_, false)) {
320
- GPR_ASSERT(in_combiner);
321
- in_combiner = false;
322
- grpc_call_next_op(
323
- self_->elem(),
324
- absl::exchange(self_->send_initial_metadata_batch_, nullptr));
325
- }
326
1226
  if (repoll_) {
327
- if (in_combiner) {
328
- self_->WakeInsideCombiner();
329
- } else {
330
- struct NextPoll : public grpc_closure {
331
- grpc_call_stack* call_stack;
332
- ClientCallData* call_data;
333
- };
334
- auto run = [](void* p, grpc_error_handle) {
335
- auto* next_poll = static_cast<NextPoll*>(p);
336
- next_poll->call_data->WakeInsideCombiner();
337
- GRPC_CALL_STACK_UNREF(next_poll->call_stack, "re-poll");
338
- delete next_poll;
339
- };
340
- auto* p = absl::make_unique<NextPoll>().release();
341
- p->call_stack = self_->call_stack();
342
- p->call_data = self_;
343
- GRPC_CALL_STACK_REF(self_->call_stack(), "re-poll");
344
- GRPC_CLOSURE_INIT(p, run, p, nullptr);
345
- GRPC_CALL_COMBINER_START(self_->call_combiner(), p, GRPC_ERROR_NONE,
346
- "re-poll");
347
- }
348
- } else if (in_combiner) {
349
- GRPC_CALL_COMBINER_STOP(self_->call_combiner(), "poll paused");
1227
+ struct NextPoll : public grpc_closure {
1228
+ grpc_call_stack* call_stack;
1229
+ ClientCallData* call_data;
1230
+ };
1231
+ auto run = [](void* p, grpc_error_handle) {
1232
+ auto* next_poll = static_cast<NextPoll*>(p);
1233
+ {
1234
+ ScopedContext ctx(next_poll->call_data);
1235
+ Flusher flusher(next_poll->call_data);
1236
+ next_poll->call_data->WakeInsideCombiner(&flusher);
1237
+ }
1238
+ GRPC_CALL_STACK_UNREF(next_poll->call_stack, "re-poll");
1239
+ delete next_poll;
1240
+ };
1241
+ // Unique ptr --> release to suppress clang-tidy warnings about allocating
1242
+ // in a destructor.
1243
+ auto* p = std::make_unique<NextPoll>().release();
1244
+ p->call_stack = self_->call_stack();
1245
+ p->call_data = self_;
1246
+ GRPC_CALL_STACK_REF(self_->call_stack(), "re-poll");
1247
+ GRPC_CLOSURE_INIT(p, run, p, nullptr);
1248
+ flusher_->AddClosure(p, absl::OkStatus(), "re-poll");
350
1249
  }
351
- GRPC_CALL_STACK_UNREF(self_->call_stack(), "finish_poll");
352
1250
  }
353
1251
 
354
1252
  void Repoll() { repoll_ = true; }
355
1253
 
356
- void ForwardSendInitialMetadata() { forward_send_initial_metadata_ = true; }
1254
+ void ForwardSendInitialMetadata() {
1255
+ self_->send_initial_metadata_batch_.ResumeWith(flusher_);
1256
+ }
357
1257
 
358
1258
  private:
359
1259
  ManualConstructor<ScopedActivity> scoped_activity_;
360
1260
  ClientCallData* self_;
361
- CallCombinerClosureList call_closures_;
362
- grpc_error_handle cancel_send_initial_metadata_error_ = GRPC_ERROR_NONE;
363
- grpc_transport_stream_op_batch* forward_batch_ = nullptr;
1261
+ Flusher* flusher_;
364
1262
  bool repoll_ = false;
365
- bool forward_send_initial_metadata_ = false;
366
1263
  bool have_scoped_activity_;
367
1264
  };
368
1265
 
369
1266
  ClientCallData::ClientCallData(grpc_call_element* elem,
370
1267
  const grpc_call_element_args* args,
371
1268
  uint8_t flags)
372
- : BaseCallData(elem, args, flags) {
1269
+ : BaseCallData(
1270
+ elem, args, flags,
1271
+ [args]() {
1272
+ return args->arena->New<ReceiveInterceptor>(args->arena);
1273
+ },
1274
+ [args]() { return args->arena->New<SendInterceptor>(args->arena); }) {
373
1275
  GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready_,
374
1276
  RecvTrailingMetadataReadyCallback, this,
375
1277
  grpc_schedule_on_exec_ctx);
376
- if (server_initial_metadata_latch() != nullptr) {
1278
+ if (server_initial_metadata_pipe() != nullptr) {
377
1279
  recv_initial_metadata_ = arena()->New<RecvInitialMetadata>();
378
1280
  }
379
1281
  }
380
1282
 
381
1283
  ClientCallData::~ClientCallData() {
382
1284
  GPR_ASSERT(poll_ctx_ == nullptr);
383
- GRPC_ERROR_UNREF(cancelled_error_);
384
1285
  if (recv_initial_metadata_ != nullptr) {
385
1286
  recv_initial_metadata_->~RecvInitialMetadata();
386
1287
  }
@@ -392,10 +1293,69 @@ void ClientCallData::ForceImmediateRepoll() {
392
1293
  poll_ctx_->Repoll();
393
1294
  }
394
1295
 
1296
+ const char* ClientCallData::StateString(SendInitialState state) {
1297
+ switch (state) {
1298
+ case SendInitialState::kInitial:
1299
+ return "INITIAL";
1300
+ case SendInitialState::kQueued:
1301
+ return "QUEUED";
1302
+ case SendInitialState::kForwarded:
1303
+ return "FORWARDED";
1304
+ case SendInitialState::kCancelled:
1305
+ return "CANCELLED";
1306
+ }
1307
+ return "UNKNOWN";
1308
+ }
1309
+
1310
+ const char* ClientCallData::StateString(RecvTrailingState state) {
1311
+ switch (state) {
1312
+ case RecvTrailingState::kInitial:
1313
+ return "INITIAL";
1314
+ case RecvTrailingState::kQueued:
1315
+ return "QUEUED";
1316
+ case RecvTrailingState::kComplete:
1317
+ return "COMPLETE";
1318
+ case RecvTrailingState::kForwarded:
1319
+ return "FORWARDED";
1320
+ case RecvTrailingState::kCancelled:
1321
+ return "CANCELLED";
1322
+ case RecvTrailingState::kResponded:
1323
+ return "RESPONDED";
1324
+ }
1325
+ return "UNKNOWN";
1326
+ }
1327
+
1328
+ std::string ClientCallData::DebugString() const {
1329
+ std::vector<absl::string_view> captured;
1330
+ if (send_initial_metadata_batch_.is_captured()) {
1331
+ captured.push_back("send_initial_metadata");
1332
+ }
1333
+ if (send_message() != nullptr && send_message()->HaveCapturedBatch()) {
1334
+ captured.push_back("send_message");
1335
+ }
1336
+ return absl::StrCat(
1337
+ "has_promise=", promise_.has_value() ? "true" : "false",
1338
+ " sent_initial_state=", StateString(send_initial_state_),
1339
+ " recv_trailing_state=", StateString(recv_trailing_state_), " captured={",
1340
+ absl::StrJoin(captured, ","), "}",
1341
+ server_initial_metadata_pipe() == nullptr
1342
+ ? ""
1343
+ : absl::StrCat(" recv_initial_metadata=",
1344
+ RecvInitialMetadata::StateString(
1345
+ recv_initial_metadata_->state)));
1346
+ }
1347
+
395
1348
  // Handle one grpc_transport_stream_op_batch
396
- void ClientCallData::StartBatch(grpc_transport_stream_op_batch* batch) {
1349
+ void ClientCallData::StartBatch(grpc_transport_stream_op_batch* b) {
397
1350
  // Fake out the activity based context.
398
1351
  ScopedContext context(this);
1352
+ CapturedBatch batch(b);
1353
+ Flusher flusher(this);
1354
+
1355
+ if (grpc_trace_channel.enabled()) {
1356
+ gpr_log(GPR_INFO, "%s StartBatch %s", LogTag().c_str(),
1357
+ DebugString().c_str());
1358
+ }
399
1359
 
400
1360
  // If this is a cancel stream, cancel anything we have pending and propagate
401
1361
  // the cancellation.
@@ -404,8 +1364,14 @@ void ClientCallData::StartBatch(grpc_transport_stream_op_batch* batch) {
404
1364
  !batch->send_trailing_metadata && !batch->send_message &&
405
1365
  !batch->recv_initial_metadata && !batch->recv_message &&
406
1366
  !batch->recv_trailing_metadata);
407
- Cancel(batch->payload->cancel_stream.cancel_error);
408
- grpc_call_next_op(elem(), batch);
1367
+ PollContext poll_ctx(this, &flusher);
1368
+ Cancel(batch->payload->cancel_stream.cancel_error, &flusher);
1369
+ poll_ctx.Run();
1370
+ if (is_last()) {
1371
+ batch.CompleteWith(&flusher);
1372
+ } else {
1373
+ batch.ResumeWith(&flusher);
1374
+ }
409
1375
  return;
410
1376
  }
411
1377
 
@@ -414,21 +1380,25 @@ void ClientCallData::StartBatch(grpc_transport_stream_op_batch* batch) {
414
1380
  switch (recv_initial_metadata_->state) {
415
1381
  case RecvInitialMetadata::kInitial:
416
1382
  recv_initial_metadata_->state =
417
- RecvInitialMetadata::kHookedWaitingForLatch;
1383
+ RecvInitialMetadata::kHookedWaitingForPipe;
418
1384
  break;
419
- case RecvInitialMetadata::kGotLatch:
420
- recv_initial_metadata_->state = RecvInitialMetadata::kHookedAndGotLatch;
1385
+ case RecvInitialMetadata::kGotPipe:
1386
+ recv_initial_metadata_->state = RecvInitialMetadata::kHookedAndGotPipe;
421
1387
  break;
422
1388
  case RecvInitialMetadata::kRespondedToTrailingMetadataPriorToHook:
423
1389
  hook = false;
424
1390
  break;
425
- case RecvInitialMetadata::kHookedWaitingForLatch:
426
- case RecvInitialMetadata::kHookedAndGotLatch:
427
- case RecvInitialMetadata::kCompleteWaitingForLatch:
428
- case RecvInitialMetadata::kCompleteAndGotLatch:
429
- case RecvInitialMetadata::kCompleteAndSetLatch:
1391
+ case RecvInitialMetadata::kHookedWaitingForPipe:
1392
+ case RecvInitialMetadata::kHookedAndGotPipe:
1393
+ case RecvInitialMetadata::kCompleteWaitingForPipe:
1394
+ case RecvInitialMetadata::kCompleteAndGotPipe:
1395
+ case RecvInitialMetadata::kCompleteAndPushedToPipe:
430
1396
  case RecvInitialMetadata::kResponded:
431
- abort(); // unreachable
1397
+ case RecvInitialMetadata::kRespondedButNeedToClosePipe:
1398
+ Crash(absl::StrFormat(
1399
+ "ILLEGAL STATE: %s",
1400
+ RecvInitialMetadata::StateString(
1401
+ recv_initial_metadata_->state))); // unreachable
432
1402
  }
433
1403
  if (hook) {
434
1404
  auto cb = [](void* ptr, grpc_error_handle error) {
@@ -445,53 +1415,74 @@ void ClientCallData::StartBatch(grpc_transport_stream_op_batch* batch) {
445
1415
  }
446
1416
  }
447
1417
 
1418
+ bool wake = false;
1419
+ if (send_message() != nullptr && batch->send_message) {
1420
+ send_message()->StartOp(batch);
1421
+ wake = true;
1422
+ }
1423
+ if (receive_message() != nullptr && batch->recv_message) {
1424
+ receive_message()->StartOp(batch);
1425
+ wake = true;
1426
+ }
1427
+
448
1428
  // send_initial_metadata: seeing this triggers the start of the promise part
449
1429
  // of this filter.
450
1430
  if (batch->send_initial_metadata) {
451
1431
  // If we're already cancelled, just terminate the batch.
452
1432
  if (send_initial_state_ == SendInitialState::kCancelled ||
453
1433
  recv_trailing_state_ == RecvTrailingState::kCancelled) {
454
- grpc_transport_stream_op_batch_finish_with_failure(
455
- batch, GRPC_ERROR_REF(cancelled_error_), call_combiner());
456
- return;
1434
+ batch.CancelWith(cancelled_error_, &flusher);
1435
+ } else {
1436
+ // Otherwise, we should not have seen a send_initial_metadata op yet.
1437
+ GPR_ASSERT(send_initial_state_ == SendInitialState::kInitial);
1438
+ // Mark ourselves as queued.
1439
+ send_initial_state_ = SendInitialState::kQueued;
1440
+ if (batch->recv_trailing_metadata) {
1441
+ // If there's a recv_trailing_metadata op, we queue that too.
1442
+ GPR_ASSERT(recv_trailing_state_ == RecvTrailingState::kInitial);
1443
+ recv_trailing_state_ = RecvTrailingState::kQueued;
1444
+ }
1445
+ // This is the queuing!
1446
+ send_initial_metadata_batch_ = batch;
1447
+ // And kick start the promise.
1448
+ StartPromise(&flusher);
1449
+ wake = false;
457
1450
  }
458
- // Otherwise, we should not have seen a send_initial_metadata op yet.
459
- GPR_ASSERT(send_initial_state_ == SendInitialState::kInitial);
460
- // Mark ourselves as queued.
461
- send_initial_state_ = SendInitialState::kQueued;
462
- if (batch->recv_trailing_metadata) {
463
- // If there's a recv_trailing_metadata op, we queue that too.
1451
+ } else if (batch->recv_trailing_metadata) {
1452
+ // recv_trailing_metadata *without* send_initial_metadata: hook it so we
1453
+ // can respond to it, and push it down.
1454
+ if (recv_trailing_state_ == RecvTrailingState::kCancelled) {
1455
+ batch.CancelWith(cancelled_error_, &flusher);
1456
+ } else {
464
1457
  GPR_ASSERT(recv_trailing_state_ == RecvTrailingState::kInitial);
465
- recv_trailing_state_ = RecvTrailingState::kQueued;
1458
+ recv_trailing_state_ = RecvTrailingState::kForwarded;
1459
+ HookRecvTrailingMetadata(batch);
466
1460
  }
467
- // This is the queuing!
468
- send_initial_metadata_batch_ = batch;
469
- // And kick start the promise.
470
- StartPromise();
471
- return;
1461
+ } else if (!cancelled_error_.ok()) {
1462
+ batch.CancelWith(cancelled_error_, &flusher);
472
1463
  }
473
1464
 
474
- // recv_trailing_metadata *without* send_initial_metadata: hook it so we can
475
- // respond to it, and push it down.
476
- if (batch->recv_trailing_metadata) {
477
- if (recv_trailing_state_ == RecvTrailingState::kCancelled) {
478
- grpc_transport_stream_op_batch_finish_with_failure(
479
- batch, GRPC_ERROR_REF(cancelled_error_), call_combiner());
480
- return;
481
- }
482
- GPR_ASSERT(recv_trailing_state_ == RecvTrailingState::kInitial);
483
- recv_trailing_state_ = RecvTrailingState::kForwarded;
484
- HookRecvTrailingMetadata(batch);
1465
+ if (wake) {
1466
+ PollContext(this, &flusher).Run();
485
1467
  }
486
1468
 
487
- grpc_call_next_op(elem(), batch);
1469
+ if (batch.is_captured()) {
1470
+ if (!is_last()) {
1471
+ batch.ResumeWith(&flusher);
1472
+ } else {
1473
+ batch.CancelWith(absl::CancelledError(), &flusher);
1474
+ }
1475
+ }
488
1476
  }
489
1477
 
490
1478
  // Handle cancellation.
491
- void ClientCallData::Cancel(grpc_error_handle error) {
1479
+ void ClientCallData::Cancel(grpc_error_handle error, Flusher* flusher) {
1480
+ if (grpc_trace_channel.enabled()) {
1481
+ gpr_log(GPR_INFO, "%s Cancel error=%s", LogTag().c_str(),
1482
+ error.ToString().c_str());
1483
+ }
492
1484
  // Track the latest reason for cancellation.
493
- GRPC_ERROR_UNREF(cancelled_error_);
494
- cancelled_error_ = GRPC_ERROR_REF(error);
1485
+ cancelled_error_ = error;
495
1486
  // Stop running the promise.
496
1487
  promise_ = ArenaPromise<ServerMetadataHandle>();
497
1488
  // If we have an op queued, fail that op.
@@ -501,60 +1492,63 @@ void ClientCallData::Cancel(grpc_error_handle error) {
501
1492
  if (recv_trailing_state_ == RecvTrailingState::kQueued) {
502
1493
  recv_trailing_state_ = RecvTrailingState::kCancelled;
503
1494
  }
504
- struct FailBatch : public grpc_closure {
505
- grpc_transport_stream_op_batch* batch;
506
- CallCombiner* call_combiner;
507
- };
508
- auto fail = [](void* p, grpc_error_handle error) {
509
- auto* f = static_cast<FailBatch*>(p);
510
- grpc_transport_stream_op_batch_finish_with_failure(
511
- f->batch, GRPC_ERROR_REF(error), f->call_combiner);
512
- delete f;
513
- };
514
- auto* b = new FailBatch();
515
- GRPC_CLOSURE_INIT(b, fail, b, nullptr);
516
- b->batch = absl::exchange(send_initial_metadata_batch_, nullptr);
517
- b->call_combiner = call_combiner();
518
- GRPC_CALL_COMBINER_START(call_combiner(), b,
519
- GRPC_ERROR_REF(cancelled_error_),
520
- "cancel pending batch");
1495
+ send_initial_metadata_batch_.CancelWith(error, flusher);
521
1496
  } else {
522
1497
  send_initial_state_ = SendInitialState::kCancelled;
523
1498
  }
524
1499
  if (recv_initial_metadata_ != nullptr) {
525
1500
  switch (recv_initial_metadata_->state) {
526
- case RecvInitialMetadata::kCompleteWaitingForLatch:
527
- case RecvInitialMetadata::kCompleteAndGotLatch:
528
- case RecvInitialMetadata::kCompleteAndSetLatch:
1501
+ case RecvInitialMetadata::kCompleteWaitingForPipe:
1502
+ case RecvInitialMetadata::kCompleteAndGotPipe:
1503
+ case RecvInitialMetadata::kCompleteAndPushedToPipe:
529
1504
  recv_initial_metadata_->state = RecvInitialMetadata::kResponded;
530
1505
  GRPC_CALL_COMBINER_START(
531
1506
  call_combiner(),
532
- absl::exchange(recv_initial_metadata_->original_on_ready, nullptr),
533
- GRPC_ERROR_REF(error), "propagate cancellation");
1507
+ std::exchange(recv_initial_metadata_->original_on_ready, nullptr),
1508
+ error, "propagate cancellation");
534
1509
  break;
535
1510
  case RecvInitialMetadata::kInitial:
536
- case RecvInitialMetadata::kGotLatch:
1511
+ case RecvInitialMetadata::kGotPipe:
537
1512
  case RecvInitialMetadata::kRespondedToTrailingMetadataPriorToHook:
538
- case RecvInitialMetadata::kHookedWaitingForLatch:
539
- case RecvInitialMetadata::kHookedAndGotLatch:
1513
+ case RecvInitialMetadata::kHookedWaitingForPipe:
1514
+ case RecvInitialMetadata::kHookedAndGotPipe:
540
1515
  case RecvInitialMetadata::kResponded:
541
1516
  break;
1517
+ case RecvInitialMetadata::kRespondedButNeedToClosePipe:
1518
+ Crash(absl::StrFormat(
1519
+ "ILLEGAL STATE: %s",
1520
+ RecvInitialMetadata::StateString(recv_initial_metadata_->state)));
1521
+ break;
542
1522
  }
543
1523
  }
1524
+ if (send_message() != nullptr) {
1525
+ send_message()->Done(*ServerMetadataFromStatus(error), flusher);
1526
+ }
1527
+ if (receive_message() != nullptr) {
1528
+ receive_message()->Done(*ServerMetadataFromStatus(error), flusher);
1529
+ }
544
1530
  }
545
1531
 
546
1532
  // Begin running the promise - which will ultimately take some initial
547
1533
  // metadata and return some trailing metadata.
548
- void ClientCallData::StartPromise() {
1534
+ void ClientCallData::StartPromise(Flusher* flusher) {
549
1535
  GPR_ASSERT(send_initial_state_ == SendInitialState::kQueued);
550
1536
  ChannelFilter* filter = static_cast<ChannelFilter*>(elem()->channel_data);
551
1537
 
552
1538
  // Construct the promise.
553
- PollContext ctx(this);
1539
+ PollContext ctx(this, flusher);
554
1540
  promise_ = filter->MakeCallPromise(
555
1541
  CallArgs{WrapMetadata(send_initial_metadata_batch_->payload
556
1542
  ->send_initial_metadata.send_initial_metadata),
557
- server_initial_metadata_latch()},
1543
+ server_initial_metadata_pipe() == nullptr
1544
+ ? nullptr
1545
+ : &server_initial_metadata_pipe()->sender,
1546
+ send_message() == nullptr
1547
+ ? nullptr
1548
+ : send_message()->interceptor()->original_receiver(),
1549
+ receive_message() == nullptr
1550
+ ? nullptr
1551
+ : receive_message()->interceptor()->original_sender()},
558
1552
  [this](CallArgs call_args) {
559
1553
  return MakeNextPromise(std::move(call_args));
560
1554
  });
@@ -562,46 +1556,76 @@ void ClientCallData::StartPromise() {
562
1556
  }
563
1557
 
564
1558
  void ClientCallData::RecvInitialMetadataReady(grpc_error_handle error) {
1559
+ if (grpc_trace_channel.enabled()) {
1560
+ gpr_log(GPR_INFO,
1561
+ "%s ClientCallData.RecvInitialMetadataReady %s error:%s md:%s",
1562
+ LogTag().c_str(), DebugString().c_str(), error.ToString().c_str(),
1563
+ recv_initial_metadata_->metadata->DebugString().c_str());
1564
+ }
565
1565
  ScopedContext context(this);
566
- switch (recv_initial_metadata_->state) {
567
- case RecvInitialMetadata::kHookedWaitingForLatch:
568
- recv_initial_metadata_->state =
569
- RecvInitialMetadata::kCompleteWaitingForLatch;
570
- break;
571
- case RecvInitialMetadata::kHookedAndGotLatch:
572
- recv_initial_metadata_->state = RecvInitialMetadata::kCompleteAndGotLatch;
573
- break;
574
- case RecvInitialMetadata::kInitial:
575
- case RecvInitialMetadata::kGotLatch:
576
- case RecvInitialMetadata::kCompleteWaitingForLatch:
577
- case RecvInitialMetadata::kCompleteAndGotLatch:
578
- case RecvInitialMetadata::kCompleteAndSetLatch:
579
- case RecvInitialMetadata::kResponded:
580
- case RecvInitialMetadata::kRespondedToTrailingMetadataPriorToHook:
581
- abort(); // unreachable
582
- }
583
- if (error != GRPC_ERROR_NONE) {
584
- recv_initial_metadata_->state = RecvInitialMetadata::kResponded;
585
- GRPC_CALL_COMBINER_START(
586
- call_combiner(),
587
- absl::exchange(recv_initial_metadata_->original_on_ready, nullptr),
588
- GRPC_ERROR_REF(error), "propagate cancellation");
1566
+ Flusher flusher(this);
1567
+ if (!error.ok()) {
1568
+ switch (recv_initial_metadata_->state) {
1569
+ case RecvInitialMetadata::kHookedWaitingForPipe:
1570
+ recv_initial_metadata_->state = RecvInitialMetadata::kResponded;
1571
+ break;
1572
+ case RecvInitialMetadata::kHookedAndGotPipe:
1573
+ recv_initial_metadata_->state =
1574
+ RecvInitialMetadata::kRespondedButNeedToClosePipe;
1575
+ break;
1576
+ case RecvInitialMetadata::kInitial:
1577
+ case RecvInitialMetadata::kGotPipe:
1578
+ case RecvInitialMetadata::kCompleteWaitingForPipe:
1579
+ case RecvInitialMetadata::kCompleteAndGotPipe:
1580
+ case RecvInitialMetadata::kCompleteAndPushedToPipe:
1581
+ case RecvInitialMetadata::kResponded:
1582
+ case RecvInitialMetadata::kRespondedToTrailingMetadataPriorToHook:
1583
+ case RecvInitialMetadata::kRespondedButNeedToClosePipe:
1584
+ Crash(absl::StrFormat(
1585
+ "ILLEGAL STATE: %s",
1586
+ RecvInitialMetadata::StateString(
1587
+ recv_initial_metadata_->state))); // unreachable
1588
+ }
1589
+ flusher.AddClosure(
1590
+ std::exchange(recv_initial_metadata_->original_on_ready, nullptr),
1591
+ error, "propagate cancellation");
589
1592
  } else if (send_initial_state_ == SendInitialState::kCancelled ||
590
1593
  recv_trailing_state_ == RecvTrailingState::kResponded) {
591
1594
  recv_initial_metadata_->state = RecvInitialMetadata::kResponded;
592
- GRPC_CALL_COMBINER_START(
593
- call_combiner(),
594
- absl::exchange(recv_initial_metadata_->original_on_ready, nullptr),
595
- GRPC_ERROR_REF(cancelled_error_), "propagate cancellation");
1595
+ flusher.AddClosure(
1596
+ std::exchange(recv_initial_metadata_->original_on_ready, nullptr),
1597
+ cancelled_error_, "propagate cancellation");
1598
+ } else {
1599
+ switch (recv_initial_metadata_->state) {
1600
+ case RecvInitialMetadata::kHookedWaitingForPipe:
1601
+ recv_initial_metadata_->state =
1602
+ RecvInitialMetadata::kCompleteWaitingForPipe;
1603
+ break;
1604
+ case RecvInitialMetadata::kHookedAndGotPipe:
1605
+ recv_initial_metadata_->state =
1606
+ RecvInitialMetadata::kCompleteAndGotPipe;
1607
+ break;
1608
+ case RecvInitialMetadata::kInitial:
1609
+ case RecvInitialMetadata::kGotPipe:
1610
+ case RecvInitialMetadata::kCompleteWaitingForPipe:
1611
+ case RecvInitialMetadata::kCompleteAndGotPipe:
1612
+ case RecvInitialMetadata::kCompleteAndPushedToPipe:
1613
+ case RecvInitialMetadata::kResponded:
1614
+ case RecvInitialMetadata::kRespondedToTrailingMetadataPriorToHook:
1615
+ case RecvInitialMetadata::kRespondedButNeedToClosePipe:
1616
+ Crash(absl::StrFormat(
1617
+ "ILLEGAL STATE: %s",
1618
+ RecvInitialMetadata::StateString(
1619
+ recv_initial_metadata_->state))); // unreachable
1620
+ }
596
1621
  }
597
- WakeInsideCombiner();
1622
+ WakeInsideCombiner(&flusher);
598
1623
  }
599
1624
 
600
1625
  // Interject our callback into the op batch for recv trailing metadata ready.
601
1626
  // Stash a pointer to the trailing metadata that will be filled in, so we can
602
1627
  // manipulate it later.
603
- void ClientCallData::HookRecvTrailingMetadata(
604
- grpc_transport_stream_op_batch* batch) {
1628
+ void ClientCallData::HookRecvTrailingMetadata(CapturedBatch batch) {
605
1629
  recv_trailing_metadata_ =
606
1630
  batch->payload->recv_trailing_metadata.recv_trailing_metadata;
607
1631
  original_recv_trailing_metadata_ready_ =
@@ -616,6 +1640,10 @@ void ClientCallData::HookRecvTrailingMetadata(
616
1640
  // - return a wrapper around PollTrailingMetadata as the promise.
617
1641
  ArenaPromise<ServerMetadataHandle> ClientCallData::MakeNextPromise(
618
1642
  CallArgs call_args) {
1643
+ if (grpc_trace_channel.enabled()) {
1644
+ gpr_log(GPR_INFO, "%s ClientCallData.MakeNextPromise %s", LogTag().c_str(),
1645
+ DebugString().c_str());
1646
+ }
619
1647
  GPR_ASSERT(poll_ctx_ != nullptr);
620
1648
  GPR_ASSERT(send_initial_state_ == SendInitialState::kQueued);
621
1649
  send_initial_metadata_batch_->payload->send_initial_metadata
@@ -631,28 +1659,42 @@ ArenaPromise<ServerMetadataHandle> ClientCallData::MakeNextPromise(
631
1659
  call_args.server_initial_metadata;
632
1660
  switch (recv_initial_metadata_->state) {
633
1661
  case RecvInitialMetadata::kInitial:
634
- recv_initial_metadata_->state = RecvInitialMetadata::kGotLatch;
1662
+ recv_initial_metadata_->state = RecvInitialMetadata::kGotPipe;
635
1663
  break;
636
- case RecvInitialMetadata::kHookedWaitingForLatch:
637
- recv_initial_metadata_->state = RecvInitialMetadata::kHookedAndGotLatch;
1664
+ case RecvInitialMetadata::kHookedWaitingForPipe:
1665
+ recv_initial_metadata_->state = RecvInitialMetadata::kHookedAndGotPipe;
638
1666
  poll_ctx_->Repoll();
639
1667
  break;
640
- case RecvInitialMetadata::kCompleteWaitingForLatch:
1668
+ case RecvInitialMetadata::kCompleteWaitingForPipe:
641
1669
  recv_initial_metadata_->state =
642
- RecvInitialMetadata::kCompleteAndGotLatch;
1670
+ RecvInitialMetadata::kCompleteAndGotPipe;
643
1671
  poll_ctx_->Repoll();
644
1672
  break;
645
- case RecvInitialMetadata::kGotLatch:
646
- case RecvInitialMetadata::kHookedAndGotLatch:
647
- case RecvInitialMetadata::kCompleteAndGotLatch:
648
- case RecvInitialMetadata::kCompleteAndSetLatch:
1673
+ case RecvInitialMetadata::kGotPipe:
1674
+ case RecvInitialMetadata::kHookedAndGotPipe:
1675
+ case RecvInitialMetadata::kCompleteAndGotPipe:
1676
+ case RecvInitialMetadata::kCompleteAndPushedToPipe:
649
1677
  case RecvInitialMetadata::kResponded:
650
1678
  case RecvInitialMetadata::kRespondedToTrailingMetadataPriorToHook:
651
- abort(); // unreachable
1679
+ case RecvInitialMetadata::kRespondedButNeedToClosePipe:
1680
+ Crash(absl::StrFormat(
1681
+ "ILLEGAL STATE: %s",
1682
+ RecvInitialMetadata::StateString(
1683
+ recv_initial_metadata_->state))); // unreachable
652
1684
  }
653
1685
  } else {
654
1686
  GPR_ASSERT(call_args.server_initial_metadata == nullptr);
655
1687
  }
1688
+ if (send_message() != nullptr) {
1689
+ send_message()->GotPipe(call_args.client_to_server_messages);
1690
+ } else {
1691
+ GPR_ASSERT(call_args.client_to_server_messages == nullptr);
1692
+ }
1693
+ if (receive_message() != nullptr) {
1694
+ receive_message()->GotPipe(call_args.server_to_client_messages);
1695
+ } else {
1696
+ GPR_ASSERT(call_args.server_to_client_messages == nullptr);
1697
+ }
656
1698
  return ArenaPromise<ServerMetadataHandle>(
657
1699
  [this]() { return PollTrailingMetadata(); });
658
1700
  }
@@ -662,10 +1704,14 @@ ArenaPromise<ServerMetadataHandle> ClientCallData::MakeNextPromise(
662
1704
  // All polls: await receiving the trailing metadata, then return it to the
663
1705
  // application.
664
1706
  Poll<ServerMetadataHandle> ClientCallData::PollTrailingMetadata() {
1707
+ if (grpc_trace_channel.enabled()) {
1708
+ gpr_log(GPR_INFO, "%s ClientCallData.PollTrailingMetadata %s",
1709
+ LogTag().c_str(), DebugString().c_str());
1710
+ }
665
1711
  GPR_ASSERT(poll_ctx_ != nullptr);
666
1712
  if (send_initial_state_ == SendInitialState::kQueued) {
667
1713
  // First poll: pass the send_initial_metadata op down the stack.
668
- GPR_ASSERT(send_initial_metadata_batch_ != nullptr);
1714
+ GPR_ASSERT(send_initial_metadata_batch_.is_captured());
669
1715
  send_initial_state_ = SendInitialState::kForwarded;
670
1716
  if (recv_trailing_state_ == RecvTrailingState::kQueued) {
671
1717
  // (and the recv_trailing_metadata op if it's part of the queuing)
@@ -696,7 +1742,8 @@ Poll<ServerMetadataHandle> ClientCallData::PollTrailingMetadata() {
696
1742
  case RecvTrailingState::kResponded:
697
1743
  // We've already responded to the caller: we can't do anything and we
698
1744
  // should never reach here.
699
- abort();
1745
+ Crash(absl::StrFormat("ILLEGAL STATE: %s",
1746
+ StateString(recv_trailing_state_)));
700
1747
  }
701
1748
  GPR_UNREACHABLE_CODE(return Pending{});
702
1749
  }
@@ -707,26 +1754,44 @@ void ClientCallData::RecvTrailingMetadataReadyCallback(
707
1754
  }
708
1755
 
709
1756
  void ClientCallData::RecvTrailingMetadataReady(grpc_error_handle error) {
1757
+ Flusher flusher(this);
1758
+ if (grpc_trace_channel.enabled()) {
1759
+ gpr_log(GPR_INFO,
1760
+ "%s ClientCallData.RecvTrailingMetadataReady "
1761
+ "recv_trailing_state=%s error=%s md=%s",
1762
+ LogTag().c_str(), StateString(recv_trailing_state_),
1763
+ error.ToString().c_str(),
1764
+ recv_trailing_metadata_->DebugString().c_str());
1765
+ }
710
1766
  // If we were cancelled prior to receiving this callback, we should simply
711
1767
  // forward the callback up with the same error.
712
1768
  if (recv_trailing_state_ == RecvTrailingState::kCancelled) {
1769
+ if (cancelling_metadata_.get() != nullptr) {
1770
+ *recv_trailing_metadata_ = std::move(*cancelling_metadata_);
1771
+ }
713
1772
  if (grpc_closure* call_closure =
714
- absl::exchange(original_recv_trailing_metadata_ready_, nullptr)) {
715
- Closure::Run(DEBUG_LOCATION, call_closure, GRPC_ERROR_REF(error));
1773
+ std::exchange(original_recv_trailing_metadata_ready_, nullptr)) {
1774
+ flusher.AddClosure(call_closure, error, "propagate failure");
716
1775
  }
717
1776
  return;
718
1777
  }
719
1778
  // If there was an error, we'll put that into the trailing metadata and
720
1779
  // proceed as if there was not.
721
- if (error != GRPC_ERROR_NONE) {
1780
+ if (!error.ok()) {
722
1781
  SetStatusFromError(recv_trailing_metadata_, error);
723
1782
  }
724
1783
  // Record that we've got the callback.
725
1784
  GPR_ASSERT(recv_trailing_state_ == RecvTrailingState::kForwarded);
726
1785
  recv_trailing_state_ = RecvTrailingState::kComplete;
1786
+ if (receive_message() != nullptr) {
1787
+ receive_message()->Done(*recv_trailing_metadata_, &flusher);
1788
+ }
1789
+ if (send_message() != nullptr) {
1790
+ send_message()->Done(*recv_trailing_metadata_, &flusher);
1791
+ }
727
1792
  // Repoll the promise.
728
1793
  ScopedContext context(this);
729
- WakeInsideCombiner();
1794
+ WakeInsideCombiner(&flusher);
730
1795
  }
731
1796
 
732
1797
  // Given an error, fill in ServerMetadataHandle to represent that error.
@@ -739,41 +1804,189 @@ void ClientCallData::SetStatusFromError(grpc_metadata_batch* metadata,
739
1804
  metadata->Set(GrpcStatusMetadata(), status_code);
740
1805
  metadata->Set(GrpcMessageMetadata(), Slice::FromCopiedString(status_details));
741
1806
  metadata->GetOrCreatePointer(GrpcStatusContext())
742
- ->emplace_back(grpc_error_std_string(error));
1807
+ ->emplace_back(StatusToString(error));
743
1808
  }
744
1809
 
745
1810
  // Wakeup and poll the promise if appropriate.
746
- void ClientCallData::WakeInsideCombiner() { PollContext(this).Run(); }
1811
+ void ClientCallData::WakeInsideCombiner(Flusher* flusher) {
1812
+ PollContext(this, flusher).Run();
1813
+ }
747
1814
 
748
1815
  void ClientCallData::OnWakeup() {
1816
+ Flusher flusher(this);
749
1817
  ScopedContext context(this);
750
- WakeInsideCombiner();
1818
+ WakeInsideCombiner(&flusher);
751
1819
  }
752
1820
 
753
1821
  ///////////////////////////////////////////////////////////////////////////////
754
1822
  // ServerCallData
755
1823
 
1824
+ struct ServerCallData::SendInitialMetadata {
1825
+ enum State {
1826
+ kInitial,
1827
+ kGotPipe,
1828
+ kQueuedWaitingForPipe,
1829
+ kQueuedAndGotPipe,
1830
+ kQueuedAndPushedToPipe,
1831
+ kForwarded,
1832
+ kCancelled,
1833
+ };
1834
+ State state = kInitial;
1835
+ CapturedBatch batch;
1836
+ PipeSender<ServerMetadataHandle>* server_initial_metadata_publisher = nullptr;
1837
+ absl::optional<PipeSender<ServerMetadataHandle>::PushType> metadata_push_;
1838
+ absl::optional<PipeReceiverNextType<ServerMetadataHandle>> metadata_next_;
1839
+
1840
+ static const char* StateString(State state) {
1841
+ switch (state) {
1842
+ case kInitial:
1843
+ return "INITIAL";
1844
+ case kGotPipe:
1845
+ return "GOT_PIPE";
1846
+ case kQueuedWaitingForPipe:
1847
+ return "QUEUED_WAITING_FOR_PIPE";
1848
+ case kQueuedAndGotPipe:
1849
+ return "QUEUED_AND_GOT_PIPE";
1850
+ case kQueuedAndPushedToPipe:
1851
+ return "QUEUED_AND_PUSHED_TO_PIPE";
1852
+ case kForwarded:
1853
+ return "FORWARDED";
1854
+ case kCancelled:
1855
+ return "CANCELLED";
1856
+ }
1857
+ return "UNKNOWN";
1858
+ }
1859
+ };
1860
+
1861
+ class ServerCallData::PollContext {
1862
+ public:
1863
+ explicit PollContext(ServerCallData* self, Flusher* flusher)
1864
+ : self_(self), flusher_(flusher) {
1865
+ GPR_ASSERT(self_->poll_ctx_ == nullptr);
1866
+ self_->poll_ctx_ = this;
1867
+ scoped_activity_.Init(self_);
1868
+ have_scoped_activity_ = true;
1869
+ }
1870
+
1871
+ PollContext(const PollContext&) = delete;
1872
+ PollContext& operator=(const PollContext&) = delete;
1873
+
1874
+ ~PollContext() {
1875
+ self_->poll_ctx_ = nullptr;
1876
+ if (have_scoped_activity_) scoped_activity_.Destroy();
1877
+ if (repoll_) {
1878
+ struct NextPoll : public grpc_closure {
1879
+ grpc_call_stack* call_stack;
1880
+ ServerCallData* call_data;
1881
+ };
1882
+ auto run = [](void* p, grpc_error_handle) {
1883
+ auto* next_poll = static_cast<NextPoll*>(p);
1884
+ {
1885
+ Flusher flusher(next_poll->call_data);
1886
+ ScopedContext context(next_poll->call_data);
1887
+ next_poll->call_data->WakeInsideCombiner(&flusher);
1888
+ }
1889
+ GRPC_CALL_STACK_UNREF(next_poll->call_stack, "re-poll");
1890
+ delete next_poll;
1891
+ };
1892
+ auto* p = std::make_unique<NextPoll>().release();
1893
+ p->call_stack = self_->call_stack();
1894
+ p->call_data = self_;
1895
+ GRPC_CALL_STACK_REF(self_->call_stack(), "re-poll");
1896
+ GRPC_CLOSURE_INIT(p, run, p, nullptr);
1897
+ flusher_->AddClosure(p, absl::OkStatus(), "re-poll");
1898
+ }
1899
+ }
1900
+
1901
+ void Repoll() { repoll_ = true; }
1902
+ void ClearRepoll() { repoll_ = false; }
1903
+
1904
+ private:
1905
+ ManualConstructor<ScopedActivity> scoped_activity_;
1906
+ ServerCallData* const self_;
1907
+ Flusher* const flusher_;
1908
+ bool repoll_ = false;
1909
+ bool have_scoped_activity_;
1910
+ };
1911
+
1912
+ const char* ServerCallData::StateString(RecvInitialState state) {
1913
+ switch (state) {
1914
+ case RecvInitialState::kInitial:
1915
+ return "INITIAL";
1916
+ case RecvInitialState::kForwarded:
1917
+ return "FORWARDED";
1918
+ case RecvInitialState::kComplete:
1919
+ return "COMPLETE";
1920
+ case RecvInitialState::kResponded:
1921
+ return "RESPONDED";
1922
+ }
1923
+ return "UNKNOWN";
1924
+ }
1925
+
1926
+ const char* ServerCallData::StateString(SendTrailingState state) {
1927
+ switch (state) {
1928
+ case SendTrailingState::kInitial:
1929
+ return "INITIAL";
1930
+ case SendTrailingState::kForwarded:
1931
+ return "FORWARDED";
1932
+ case SendTrailingState::kQueuedBehindSendMessage:
1933
+ return "QUEUED_BEHIND_SEND_MESSAGE";
1934
+ case SendTrailingState::kQueuedButHaventClosedSends:
1935
+ return "QUEUED_BUT_HAVENT_CLOSED_SENDS";
1936
+ case SendTrailingState::kQueued:
1937
+ return "QUEUED";
1938
+ case SendTrailingState::kCancelled:
1939
+ return "CANCELLED";
1940
+ }
1941
+ return "UNKNOWN";
1942
+ }
1943
+
756
1944
  ServerCallData::ServerCallData(grpc_call_element* elem,
757
1945
  const grpc_call_element_args* args,
758
1946
  uint8_t flags)
759
- : BaseCallData(elem, args, flags) {
1947
+ : BaseCallData(
1948
+ elem, args, flags,
1949
+ [args]() { return args->arena->New<SendInterceptor>(args->arena); },
1950
+ [args]() {
1951
+ return args->arena->New<ReceiveInterceptor>(args->arena);
1952
+ }) {
1953
+ if (server_initial_metadata_pipe() != nullptr) {
1954
+ send_initial_metadata_ = arena()->New<SendInitialMetadata>();
1955
+ }
760
1956
  GRPC_CLOSURE_INIT(&recv_initial_metadata_ready_,
761
1957
  RecvInitialMetadataReadyCallback, this,
762
1958
  grpc_schedule_on_exec_ctx);
1959
+ GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready_,
1960
+ RecvTrailingMetadataReadyCallback, this,
1961
+ grpc_schedule_on_exec_ctx);
763
1962
  }
764
1963
 
765
1964
  ServerCallData::~ServerCallData() {
766
- GPR_ASSERT(!is_polling_);
767
- GRPC_ERROR_UNREF(cancelled_error_);
1965
+ if (grpc_trace_channel.enabled()) {
1966
+ gpr_log(GPR_INFO, "%s ~ServerCallData %s", LogTag().c_str(),
1967
+ DebugString().c_str());
1968
+ }
1969
+ GPR_ASSERT(poll_ctx_ == nullptr);
768
1970
  }
769
1971
 
770
1972
  // Activity implementation.
771
- void ServerCallData::ForceImmediateRepoll() { abort(); } // Not implemented.
1973
+ void ServerCallData::ForceImmediateRepoll() {
1974
+ GPR_ASSERT(poll_ctx_ != nullptr);
1975
+ poll_ctx_->Repoll();
1976
+ }
772
1977
 
773
1978
  // Handle one grpc_transport_stream_op_batch
774
- void ServerCallData::StartBatch(grpc_transport_stream_op_batch* batch) {
1979
+ void ServerCallData::StartBatch(grpc_transport_stream_op_batch* b) {
775
1980
  // Fake out the activity based context.
776
1981
  ScopedContext context(this);
1982
+ CapturedBatch batch(b);
1983
+ Flusher flusher(this);
1984
+ bool wake = false;
1985
+
1986
+ if (grpc_trace_channel.enabled()) {
1987
+ gpr_log(GPR_INFO, "%s StartBatch: %s", LogTag().c_str(),
1988
+ DebugString().c_str());
1989
+ }
777
1990
 
778
1991
  // If this is a cancel stream, cancel anything we have pending and
779
1992
  // propagate the cancellation.
@@ -782,8 +1995,13 @@ void ServerCallData::StartBatch(grpc_transport_stream_op_batch* batch) {
782
1995
  !batch->send_trailing_metadata && !batch->send_message &&
783
1996
  !batch->recv_initial_metadata && !batch->recv_message &&
784
1997
  !batch->recv_trailing_metadata);
785
- Cancel(batch->payload->cancel_stream.cancel_error);
786
- grpc_call_next_op(elem(), batch);
1998
+ PollContext poll_ctx(this, &flusher);
1999
+ Completed(batch->payload->cancel_stream.cancel_error, &flusher);
2000
+ if (is_last()) {
2001
+ batch.CompleteWith(&flusher);
2002
+ } else {
2003
+ batch.ResumeWith(&flusher);
2004
+ }
787
2005
  return;
788
2006
  }
789
2007
 
@@ -805,60 +2023,160 @@ void ServerCallData::StartBatch(grpc_transport_stream_op_batch* batch) {
805
2023
  recv_initial_state_ = RecvInitialState::kForwarded;
806
2024
  }
807
2025
 
2026
+ // Hook recv_trailing_metadata so we can see cancellation from the client.
2027
+ if (batch->recv_trailing_metadata) {
2028
+ recv_trailing_metadata_ =
2029
+ batch->payload->recv_trailing_metadata.recv_trailing_metadata;
2030
+ original_recv_trailing_metadata_ready_ =
2031
+ batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready;
2032
+ batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready =
2033
+ &recv_trailing_metadata_ready_;
2034
+ }
2035
+
2036
+ // send_initial_metadata
2037
+ if (send_initial_metadata_ != nullptr && batch->send_initial_metadata) {
2038
+ switch (send_initial_metadata_->state) {
2039
+ case SendInitialMetadata::kInitial:
2040
+ send_initial_metadata_->state =
2041
+ SendInitialMetadata::kQueuedWaitingForPipe;
2042
+ break;
2043
+ case SendInitialMetadata::kGotPipe:
2044
+ send_initial_metadata_->state = SendInitialMetadata::kQueuedAndGotPipe;
2045
+ break;
2046
+ case SendInitialMetadata::kCancelled:
2047
+ batch.CancelWith(
2048
+ cancelled_error_.ok() ? absl::CancelledError() : cancelled_error_,
2049
+ &flusher);
2050
+ break;
2051
+ case SendInitialMetadata::kQueuedAndGotPipe:
2052
+ case SendInitialMetadata::kQueuedWaitingForPipe:
2053
+ case SendInitialMetadata::kQueuedAndPushedToPipe:
2054
+ case SendInitialMetadata::kForwarded:
2055
+ Crash(absl::StrFormat(
2056
+ "ILLEGAL STATE: %s",
2057
+ SendInitialMetadata::StateString(
2058
+ send_initial_metadata_->state))); // not reachable
2059
+ }
2060
+ send_initial_metadata_->batch = batch;
2061
+ wake = true;
2062
+ }
2063
+
2064
+ if (send_message() != nullptr && batch.is_captured() && batch->send_message) {
2065
+ send_message()->StartOp(batch);
2066
+ wake = true;
2067
+ }
2068
+ if (receive_message() != nullptr && batch.is_captured() &&
2069
+ batch->recv_message) {
2070
+ receive_message()->StartOp(batch);
2071
+ wake = true;
2072
+ }
2073
+
808
2074
  // send_trailing_metadata
809
- if (batch->send_trailing_metadata) {
2075
+ if (batch.is_captured() && batch->send_trailing_metadata) {
810
2076
  switch (send_trailing_state_) {
811
2077
  case SendTrailingState::kInitial:
812
2078
  send_trailing_metadata_batch_ = batch;
813
- send_trailing_state_ = SendTrailingState::kQueued;
814
- WakeInsideCombiner([this](grpc_error_handle error) {
815
- GPR_ASSERT(send_trailing_state_ == SendTrailingState::kQueued);
816
- Cancel(error);
817
- });
2079
+ if (receive_message() != nullptr) {
2080
+ receive_message()->Done(
2081
+ *batch->payload->send_trailing_metadata.send_trailing_metadata,
2082
+ &flusher);
2083
+ }
2084
+ if (send_message() != nullptr && !send_message()->IsIdle()) {
2085
+ send_trailing_state_ = SendTrailingState::kQueuedBehindSendMessage;
2086
+ } else if (send_message() != nullptr) {
2087
+ send_trailing_state_ = SendTrailingState::kQueuedButHaventClosedSends;
2088
+ wake = true;
2089
+ } else {
2090
+ send_trailing_state_ = SendTrailingState::kQueued;
2091
+ wake = true;
2092
+ }
818
2093
  break;
819
2094
  case SendTrailingState::kQueued:
2095
+ case SendTrailingState::kQueuedBehindSendMessage:
2096
+ case SendTrailingState::kQueuedButHaventClosedSends:
820
2097
  case SendTrailingState::kForwarded:
821
- abort(); // unreachable
2098
+ Crash(
2099
+ absl::StrFormat("ILLEGAL STATE: %s",
2100
+ StateString(send_trailing_state_))); // unreachable
822
2101
  break;
823
2102
  case SendTrailingState::kCancelled:
824
- grpc_transport_stream_op_batch_finish_with_failure(
825
- batch, GRPC_ERROR_REF(cancelled_error_), call_combiner());
2103
+ batch.CancelWith(
2104
+ cancelled_error_.ok() ? absl::CancelledError() : cancelled_error_,
2105
+ &flusher);
826
2106
  break;
827
2107
  }
828
- return;
829
2108
  }
830
2109
 
831
- grpc_call_next_op(elem(), batch);
2110
+ if (wake) WakeInsideCombiner(&flusher);
2111
+ if (batch.is_captured()) batch.ResumeWith(&flusher);
832
2112
  }
833
2113
 
834
2114
  // Handle cancellation.
835
- void ServerCallData::Cancel(grpc_error_handle error) {
2115
+ void ServerCallData::Completed(grpc_error_handle error, Flusher* flusher) {
2116
+ if (grpc_trace_channel.enabled()) {
2117
+ gpr_log(
2118
+ GPR_DEBUG,
2119
+ "%sServerCallData::Completed: send_trailing_state=%s "
2120
+ "send_initial_state=%s error=%s",
2121
+ LogTag().c_str(), StateString(send_trailing_state_),
2122
+ send_initial_metadata_ == nullptr
2123
+ ? "null"
2124
+ : SendInitialMetadata::StateString(send_initial_metadata_->state),
2125
+ error.ToString().c_str());
2126
+ }
836
2127
  // Track the latest reason for cancellation.
837
- GRPC_ERROR_UNREF(cancelled_error_);
838
- cancelled_error_ = GRPC_ERROR_REF(error);
2128
+ cancelled_error_ = error;
839
2129
  // Stop running the promise.
840
2130
  promise_ = ArenaPromise<ServerMetadataHandle>();
841
- if (send_trailing_state_ == SendTrailingState::kQueued) {
842
- send_trailing_state_ = SendTrailingState::kCancelled;
843
- struct FailBatch : public grpc_closure {
844
- grpc_transport_stream_op_batch* batch;
845
- CallCombiner* call_combiner;
846
- };
847
- auto fail = [](void* p, grpc_error_handle error) {
848
- auto* f = static_cast<FailBatch*>(p);
849
- grpc_transport_stream_op_batch_finish_with_failure(
850
- f->batch, GRPC_ERROR_REF(error), f->call_combiner);
851
- delete f;
852
- };
853
- auto* b = new FailBatch();
854
- GRPC_CLOSURE_INIT(b, fail, b, nullptr);
855
- b->batch = absl::exchange(send_trailing_metadata_batch_, nullptr);
856
- b->call_combiner = call_combiner();
857
- GRPC_CALL_COMBINER_START(call_combiner(), b,
858
- GRPC_ERROR_REF(cancelled_error_),
859
- "cancel pending batch");
860
- } else {
861
- send_trailing_state_ = SendTrailingState::kCancelled;
2131
+ switch (send_trailing_state_) {
2132
+ case SendTrailingState::kInitial:
2133
+ case SendTrailingState::kForwarded:
2134
+ send_trailing_state_ = SendTrailingState::kCancelled;
2135
+ if (!error.ok()) {
2136
+ auto* batch = grpc_make_transport_stream_op(
2137
+ NewClosure([call_combiner = call_combiner()](absl::Status) {
2138
+ GRPC_CALL_COMBINER_STOP(call_combiner, "done-cancel");
2139
+ }));
2140
+ batch->cancel_stream = true;
2141
+ batch->payload->cancel_stream.cancel_error = error;
2142
+ flusher->Resume(batch);
2143
+ }
2144
+ break;
2145
+ case SendTrailingState::kQueued:
2146
+ send_trailing_state_ = SendTrailingState::kCancelled;
2147
+ send_trailing_metadata_batch_.CancelWith(error, flusher);
2148
+ break;
2149
+ case SendTrailingState::kQueuedBehindSendMessage:
2150
+ case SendTrailingState::kQueuedButHaventClosedSends:
2151
+ case SendTrailingState::kCancelled:
2152
+ send_trailing_state_ = SendTrailingState::kCancelled;
2153
+ break;
2154
+ }
2155
+ if (send_initial_metadata_ != nullptr) {
2156
+ switch (send_initial_metadata_->state) {
2157
+ case SendInitialMetadata::kInitial:
2158
+ case SendInitialMetadata::kGotPipe:
2159
+ case SendInitialMetadata::kForwarded:
2160
+ case SendInitialMetadata::kCancelled:
2161
+ break;
2162
+ case SendInitialMetadata::kQueuedWaitingForPipe:
2163
+ case SendInitialMetadata::kQueuedAndGotPipe:
2164
+ case SendInitialMetadata::kQueuedAndPushedToPipe:
2165
+ send_initial_metadata_->batch.CancelWith(error, flusher);
2166
+ break;
2167
+ }
2168
+ send_initial_metadata_->state = SendInitialMetadata::kCancelled;
2169
+ }
2170
+ if (auto* closure =
2171
+ std::exchange(original_recv_initial_metadata_ready_, nullptr)) {
2172
+ flusher->AddClosure(closure, error, "original_recv_initial_metadata");
2173
+ }
2174
+ ScopedContext ctx(this);
2175
+ if (send_message() != nullptr) {
2176
+ send_message()->Done(*ServerMetadataFromStatus(error), flusher);
2177
+ }
2178
+ if (receive_message() != nullptr) {
2179
+ receive_message()->Done(*ServerMetadataFromStatus(error), flusher);
862
2180
  }
863
2181
  }
864
2182
 
@@ -872,6 +2190,44 @@ ArenaPromise<ServerMetadataHandle> ServerCallData::MakeNextPromise(
872
2190
  GPR_ASSERT(UnwrapMetadata(std::move(call_args.client_initial_metadata)) ==
873
2191
  recv_initial_metadata_);
874
2192
  forward_recv_initial_metadata_callback_ = true;
2193
+ if (send_initial_metadata_ != nullptr) {
2194
+ GPR_ASSERT(send_initial_metadata_->server_initial_metadata_publisher ==
2195
+ nullptr);
2196
+ GPR_ASSERT(call_args.server_initial_metadata != nullptr);
2197
+ send_initial_metadata_->server_initial_metadata_publisher =
2198
+ call_args.server_initial_metadata;
2199
+ switch (send_initial_metadata_->state) {
2200
+ case SendInitialMetadata::kInitial:
2201
+ send_initial_metadata_->state = SendInitialMetadata::kGotPipe;
2202
+ break;
2203
+ case SendInitialMetadata::kGotPipe:
2204
+ case SendInitialMetadata::kQueuedAndGotPipe:
2205
+ case SendInitialMetadata::kQueuedAndPushedToPipe:
2206
+ case SendInitialMetadata::kForwarded:
2207
+ Crash(absl::StrFormat(
2208
+ "ILLEGAL STATE: %s",
2209
+ SendInitialMetadata::StateString(
2210
+ send_initial_metadata_->state))); // not reachable
2211
+ break;
2212
+ case SendInitialMetadata::kQueuedWaitingForPipe:
2213
+ send_initial_metadata_->state = SendInitialMetadata::kQueuedAndGotPipe;
2214
+ break;
2215
+ case SendInitialMetadata::kCancelled:
2216
+ break;
2217
+ }
2218
+ } else {
2219
+ GPR_ASSERT(call_args.server_initial_metadata == nullptr);
2220
+ }
2221
+ if (send_message() != nullptr) {
2222
+ send_message()->GotPipe(call_args.server_to_client_messages);
2223
+ } else {
2224
+ GPR_ASSERT(call_args.server_to_client_messages == nullptr);
2225
+ }
2226
+ if (receive_message() != nullptr) {
2227
+ receive_message()->GotPipe(call_args.client_to_server_messages);
2228
+ } else {
2229
+ GPR_ASSERT(call_args.client_to_server_messages == nullptr);
2230
+ }
875
2231
  return ArenaPromise<ServerMetadataHandle>(
876
2232
  [this]() { return PollTrailingMetadata(); });
877
2233
  }
@@ -880,14 +2236,21 @@ ArenaPromise<ServerMetadataHandle> ServerCallData::MakeNextPromise(
880
2236
  // All polls: await sending the trailing metadata, then foward it down the
881
2237
  // stack.
882
2238
  Poll<ServerMetadataHandle> ServerCallData::PollTrailingMetadata() {
2239
+ if (grpc_trace_channel.enabled()) {
2240
+ gpr_log(GPR_INFO, "%s PollTrailingMetadata: %s", LogTag().c_str(),
2241
+ StateString(send_trailing_state_));
2242
+ }
883
2243
  switch (send_trailing_state_) {
884
2244
  case SendTrailingState::kInitial:
2245
+ case SendTrailingState::kQueuedBehindSendMessage:
2246
+ case SendTrailingState::kQueuedButHaventClosedSends:
885
2247
  return Pending{};
886
2248
  case SendTrailingState::kQueued:
887
2249
  return WrapMetadata(send_trailing_metadata_batch_->payload
888
2250
  ->send_trailing_metadata.send_trailing_metadata);
889
2251
  case SendTrailingState::kForwarded:
890
- abort(); // unreachable
2252
+ Crash(absl::StrFormat("ILLEGAL STATE: %s",
2253
+ StateString(send_trailing_state_))); // unreachable
891
2254
  case SendTrailingState::kCancelled:
892
2255
  // We could translate cancelled_error to metadata and return it... BUT
893
2256
  // we're not gonna be running much longer and the results going to be
@@ -897,18 +2260,43 @@ Poll<ServerMetadataHandle> ServerCallData::PollTrailingMetadata() {
897
2260
  GPR_UNREACHABLE_CODE(return Pending{});
898
2261
  }
899
2262
 
2263
+ void ServerCallData::RecvTrailingMetadataReadyCallback(
2264
+ void* arg, grpc_error_handle error) {
2265
+ static_cast<ServerCallData*>(arg)->RecvTrailingMetadataReady(
2266
+ std::move(error));
2267
+ }
2268
+
2269
+ void ServerCallData::RecvTrailingMetadataReady(grpc_error_handle error) {
2270
+ if (grpc_trace_channel.enabled()) {
2271
+ gpr_log(GPR_INFO, "%s: RecvTrailingMetadataReady error=%s md=%s",
2272
+ LogTag().c_str(), error.ToString().c_str(),
2273
+ recv_trailing_metadata_->DebugString().c_str());
2274
+ }
2275
+ Flusher flusher(this);
2276
+ PollContext poll_ctx(this, &flusher);
2277
+ Completed(error, &flusher);
2278
+ flusher.AddClosure(original_recv_trailing_metadata_ready_, std::move(error),
2279
+ "continue recv trailing");
2280
+ }
2281
+
900
2282
  void ServerCallData::RecvInitialMetadataReadyCallback(void* arg,
901
2283
  grpc_error_handle error) {
902
- static_cast<ServerCallData*>(arg)->RecvInitialMetadataReady(error);
2284
+ static_cast<ServerCallData*>(arg)->RecvInitialMetadataReady(std::move(error));
903
2285
  }
904
2286
 
905
2287
  void ServerCallData::RecvInitialMetadataReady(grpc_error_handle error) {
2288
+ Flusher flusher(this);
2289
+ if (grpc_trace_channel.enabled()) {
2290
+ gpr_log(GPR_INFO, "%s: RecvInitialMetadataReady %s", LogTag().c_str(),
2291
+ error.ToString().c_str());
2292
+ }
906
2293
  GPR_ASSERT(recv_initial_state_ == RecvInitialState::kForwarded);
907
2294
  // If there was an error we just propagate that through
908
- if (error != GRPC_ERROR_NONE) {
2295
+ if (!error.ok()) {
909
2296
  recv_initial_state_ = RecvInitialState::kResponded;
910
- Closure::Run(DEBUG_LOCATION, original_recv_initial_metadata_ready_,
911
- GRPC_ERROR_REF(error));
2297
+ flusher.AddClosure(
2298
+ std::exchange(original_recv_initial_metadata_ready_, nullptr), error,
2299
+ "propagate error");
912
2300
  return;
913
2301
  }
914
2302
  // Record that we've got the callback.
@@ -918,40 +2306,173 @@ void ServerCallData::RecvInitialMetadataReady(grpc_error_handle error) {
918
2306
  ScopedContext context(this);
919
2307
  // Construct the promise.
920
2308
  ChannelFilter* filter = static_cast<ChannelFilter*>(elem()->channel_data);
921
- promise_ =
922
- filter->MakeCallPromise(CallArgs{WrapMetadata(recv_initial_metadata_),
923
- server_initial_metadata_latch()},
924
- [this](CallArgs call_args) {
925
- return MakeNextPromise(std::move(call_args));
926
- });
927
- // Poll once.
928
- bool own_error = false;
929
- WakeInsideCombiner([&error, &own_error](grpc_error_handle new_error) {
930
- GPR_ASSERT(error == GRPC_ERROR_NONE);
931
- error = GRPC_ERROR_REF(new_error);
932
- own_error = true;
2309
+ FakeActivity(this).Run([this, filter] {
2310
+ promise_ = filter->MakeCallPromise(
2311
+ CallArgs{WrapMetadata(recv_initial_metadata_),
2312
+ server_initial_metadata_pipe() == nullptr
2313
+ ? nullptr
2314
+ : &server_initial_metadata_pipe()->sender,
2315
+ receive_message() == nullptr
2316
+ ? nullptr
2317
+ : receive_message()->interceptor()->original_receiver(),
2318
+ send_message() == nullptr
2319
+ ? nullptr
2320
+ : send_message()->interceptor()->original_sender()},
2321
+ [this](CallArgs call_args) {
2322
+ return MakeNextPromise(std::move(call_args));
2323
+ });
933
2324
  });
934
- Closure::Run(DEBUG_LOCATION, original_recv_initial_metadata_ready_,
935
- GRPC_ERROR_REF(error));
936
- if (own_error) GRPC_ERROR_UNREF(error);
2325
+ // Poll once.
2326
+ WakeInsideCombiner(&flusher);
2327
+ }
2328
+
2329
+ std::string ServerCallData::DebugString() const {
2330
+ std::vector<absl::string_view> captured;
2331
+ if (send_message() != nullptr && send_message()->HaveCapturedBatch()) {
2332
+ captured.push_back("send_message");
2333
+ }
2334
+ if (send_trailing_metadata_batch_.is_captured()) {
2335
+ captured.push_back("send_trailing_metadata");
2336
+ }
2337
+ return absl::StrCat(
2338
+ "have_promise=", promise_.has_value() ? "true" : "false",
2339
+ " recv_initial_state=", StateString(recv_initial_state_),
2340
+ " send_trailing_state=", StateString(send_trailing_state_), " captured={",
2341
+ absl::StrJoin(captured, ","), "}",
2342
+ send_initial_metadata_ == nullptr
2343
+ ? ""
2344
+ : absl::StrCat(
2345
+ " send_initial_metadata=",
2346
+ SendInitialMetadata::StateString(send_initial_metadata_->state))
2347
+ .c_str());
937
2348
  }
938
2349
 
939
2350
  // Wakeup and poll the promise if appropriate.
940
- void ServerCallData::WakeInsideCombiner(
941
- absl::FunctionRef<void(grpc_error_handle)> cancel) {
942
- GPR_ASSERT(!is_polling_);
943
- bool forward_send_trailing_metadata = false;
944
- is_polling_ = true;
945
- if (recv_initial_state_ == RecvInitialState::kComplete) {
2351
+ void ServerCallData::WakeInsideCombiner(Flusher* flusher) {
2352
+ PollContext poll_ctx(this, flusher);
2353
+ if (grpc_trace_channel.enabled()) {
2354
+ gpr_log(GPR_INFO, "%s: WakeInsideCombiner %s", LogTag().c_str(),
2355
+ DebugString().c_str());
2356
+ }
2357
+ poll_ctx.ClearRepoll();
2358
+ if (send_initial_metadata_ != nullptr) {
2359
+ if (send_initial_metadata_->state ==
2360
+ SendInitialMetadata::kQueuedAndGotPipe) {
2361
+ send_initial_metadata_->state =
2362
+ SendInitialMetadata::kQueuedAndPushedToPipe;
2363
+ GPR_ASSERT(!send_initial_metadata_->metadata_push_.has_value());
2364
+ GPR_ASSERT(!send_initial_metadata_->metadata_next_.has_value());
2365
+ send_initial_metadata_->metadata_push_.emplace(
2366
+ send_initial_metadata_->server_initial_metadata_publisher->Push(
2367
+ ServerMetadataHandle(
2368
+ send_initial_metadata_->batch->payload->send_initial_metadata
2369
+ .send_initial_metadata,
2370
+ Arena::PooledDeleter(nullptr))));
2371
+ send_initial_metadata_->metadata_next_.emplace(
2372
+ server_initial_metadata_pipe()->receiver.Next());
2373
+ }
2374
+ if (send_initial_metadata_->metadata_push_.has_value()) {
2375
+ if ((*send_initial_metadata_->metadata_push_)().ready()) {
2376
+ if (grpc_trace_channel.enabled()) {
2377
+ gpr_log(GPR_INFO, "%s: WakeInsideCombiner: metadata_push done",
2378
+ LogTag().c_str());
2379
+ }
2380
+ send_initial_metadata_->metadata_push_.reset();
2381
+ } else if (grpc_trace_channel.enabled()) {
2382
+ gpr_log(GPR_INFO, "%s: WakeInsideCombiner: metadata_push pending",
2383
+ LogTag().c_str());
2384
+ }
2385
+ }
2386
+ }
2387
+ if (send_message() != nullptr) {
2388
+ if (send_trailing_state_ ==
2389
+ SendTrailingState::kQueuedButHaventClosedSends) {
2390
+ send_trailing_state_ = SendTrailingState::kQueued;
2391
+ send_message()->Done(*send_trailing_metadata_batch_->payload
2392
+ ->send_trailing_metadata.send_trailing_metadata,
2393
+ flusher);
2394
+ }
2395
+ send_message()->WakeInsideCombiner(
2396
+ flusher,
2397
+ send_initial_metadata_ == nullptr ||
2398
+ send_initial_metadata_->state == SendInitialMetadata::kForwarded);
2399
+ if (grpc_trace_channel.enabled()) {
2400
+ gpr_log(GPR_DEBUG,
2401
+ "%s: After send_message WakeInsideCombiner %s is_idle=%s "
2402
+ "is_forwarded=%s",
2403
+ LogTag().c_str(), DebugString().c_str(),
2404
+ send_message()->IsIdle() ? "true" : "false",
2405
+ send_message()->IsForwarded() ? "true" : "false");
2406
+ }
2407
+ if (send_trailing_state_ == SendTrailingState::kQueuedBehindSendMessage &&
2408
+ (send_message()->IsIdle() ||
2409
+ (send_trailing_metadata_batch_->send_message &&
2410
+ send_message()->IsForwarded()))) {
2411
+ send_trailing_state_ = SendTrailingState::kQueued;
2412
+ send_message()->Done(*send_trailing_metadata_batch_->payload
2413
+ ->send_trailing_metadata.send_trailing_metadata,
2414
+ flusher);
2415
+ }
2416
+ }
2417
+ if (receive_message() != nullptr) {
2418
+ receive_message()->WakeInsideCombiner(flusher, true);
2419
+ }
2420
+ if (promise_.has_value()) {
946
2421
  Poll<ServerMetadataHandle> poll;
947
- {
948
- ScopedActivity activity(this);
949
- poll = promise_();
2422
+ poll = promise_();
2423
+ if (grpc_trace_channel.enabled()) {
2424
+ gpr_log(
2425
+ GPR_INFO,
2426
+ "%s: WakeInsideCombiner poll=%s; send_initial_metadata=%s "
2427
+ "send_trailing_metadata=%s",
2428
+ LogTag().c_str(),
2429
+ PollToString(
2430
+ poll,
2431
+ [](const ServerMetadataHandle& h) { return h->DebugString(); })
2432
+ .c_str(),
2433
+ send_initial_metadata_ == nullptr
2434
+ ? "null"
2435
+ : SendInitialMetadata::StateString(send_initial_metadata_->state),
2436
+ StateString(send_trailing_state_));
2437
+ }
2438
+ if (send_initial_metadata_ != nullptr &&
2439
+ send_initial_metadata_->state ==
2440
+ SendInitialMetadata::kQueuedAndPushedToPipe) {
2441
+ GPR_ASSERT(send_initial_metadata_->metadata_next_.has_value());
2442
+ auto p = (*send_initial_metadata_->metadata_next_)();
2443
+ if (grpc_trace_channel.enabled()) {
2444
+ gpr_log(GPR_INFO,
2445
+ "%s: WakeInsideCombiner send_initial_metadata poll=%s",
2446
+ LogTag().c_str(),
2447
+ PollToString(p, [](const NextResult<ServerMetadataHandle>& h) {
2448
+ return (*h)->DebugString();
2449
+ }).c_str());
2450
+ }
2451
+ if (auto* nr = p.value_if_ready()) {
2452
+ ServerMetadataHandle md = std::move(nr->value());
2453
+ if (send_initial_metadata_->batch->payload->send_initial_metadata
2454
+ .send_initial_metadata != md.get()) {
2455
+ *send_initial_metadata_->batch->payload->send_initial_metadata
2456
+ .send_initial_metadata = std::move(*md);
2457
+ }
2458
+ send_initial_metadata_->state = SendInitialMetadata::kForwarded;
2459
+ poll_ctx.Repoll();
2460
+ send_initial_metadata_->batch.ResumeWith(flusher);
2461
+ }
950
2462
  }
951
- if (auto* r = absl::get_if<ServerMetadataHandle>(&poll)) {
2463
+ if (auto* r = poll.value_if_ready()) {
2464
+ promise_ = ArenaPromise<ServerMetadataHandle>();
952
2465
  auto* md = UnwrapMetadata(std::move(*r));
953
2466
  bool destroy_md = true;
2467
+ if (send_message() != nullptr) {
2468
+ send_message()->Done(*md, flusher);
2469
+ }
2470
+ if (receive_message() != nullptr) {
2471
+ receive_message()->Done(*md, flusher);
2472
+ }
954
2473
  switch (send_trailing_state_) {
2474
+ case SendTrailingState::kQueuedBehindSendMessage:
2475
+ case SendTrailingState::kQueuedButHaventClosedSends:
955
2476
  case SendTrailingState::kQueued: {
956
2477
  if (send_trailing_metadata_batch_->payload->send_trailing_metadata
957
2478
  .send_trailing_metadata != md) {
@@ -960,25 +2481,17 @@ void ServerCallData::WakeInsideCombiner(
960
2481
  } else {
961
2482
  destroy_md = false;
962
2483
  }
963
- forward_send_trailing_metadata = true;
2484
+ send_trailing_metadata_batch_.ResumeWith(flusher);
964
2485
  send_trailing_state_ = SendTrailingState::kForwarded;
965
2486
  } break;
966
2487
  case SendTrailingState::kForwarded:
967
- abort(); // unreachable
2488
+ Crash(absl::StrFormat(
2489
+ "ILLEGAL STATE: %s",
2490
+ StateString(send_trailing_state_))); // unreachable
968
2491
  break;
969
2492
  case SendTrailingState::kInitial: {
970
2493
  GPR_ASSERT(*md->get_pointer(GrpcStatusMetadata()) != GRPC_STATUS_OK);
971
- grpc_error_handle error =
972
- grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
973
- "early return from promise based filter"),
974
- GRPC_ERROR_INT_GRPC_STATUS,
975
- *md->get_pointer(GrpcStatusMetadata()));
976
- if (auto* message = md->get_pointer(GrpcMessageMetadata())) {
977
- error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE,
978
- message->as_string_view());
979
- }
980
- cancel(error);
981
- GRPC_ERROR_UNREF(error);
2494
+ Completed(StatusFromMetadata(*md), flusher);
982
2495
  } break;
983
2496
  case SendTrailingState::kCancelled:
984
2497
  // Nothing to do.
@@ -989,14 +2502,20 @@ void ServerCallData::WakeInsideCombiner(
989
2502
  }
990
2503
  }
991
2504
  }
992
- is_polling_ = false;
993
- if (forward_send_trailing_metadata) {
994
- grpc_call_next_op(elem(),
995
- absl::exchange(send_trailing_metadata_batch_, nullptr));
2505
+ if (std::exchange(forward_recv_initial_metadata_callback_, false)) {
2506
+ if (auto* closure =
2507
+ std::exchange(original_recv_initial_metadata_ready_, nullptr)) {
2508
+ flusher->AddClosure(closure, absl::OkStatus(),
2509
+ "original_recv_initial_metadata");
2510
+ }
996
2511
  }
997
2512
  }
998
2513
 
999
- void ServerCallData::OnWakeup() { abort(); } // not implemented
2514
+ void ServerCallData::OnWakeup() {
2515
+ Flusher flusher(this);
2516
+ ScopedContext context(this);
2517
+ WakeInsideCombiner(&flusher);
2518
+ }
1000
2519
 
1001
2520
  } // namespace promise_filter_detail
1002
2521
  } // namespace grpc_core