grpc 1.45.0 → 1.53.0

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

Potentially problematic release.


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

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