grpc 1.52.0.pre2 → 1.53.0.pre2

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 (892) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +50 -5
  3. data/include/grpc/event_engine/event_engine.h +24 -2
  4. data/include/grpc/event_engine/slice_buffer.h +13 -1
  5. data/include/grpc/impl/grpc_types.h +3 -0
  6. data/include/grpc/support/time.h +6 -4
  7. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +148 -0
  8. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +52 -0
  9. data/src/core/ext/filters/backend_metrics/backend_metric_provider.h +29 -0
  10. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +3 -3
  11. data/src/core/ext/filters/channel_idle/idle_filter_state.h +3 -3
  12. data/src/core/ext/filters/client_channel/backend_metric.h +3 -3
  13. data/src/core/ext/filters/client_channel/backup_poller.h +3 -3
  14. data/src/core/ext/filters/client_channel/channel_connectivity.cc +1 -1
  15. data/src/core/ext/filters/client_channel/client_channel.cc +29 -33
  16. data/src/core/ext/filters/client_channel/client_channel.h +3 -3
  17. data/src/core/ext/filters/client_channel/client_channel_channelz.h +3 -3
  18. data/src/core/ext/filters/client_channel/client_channel_factory.h +3 -3
  19. data/src/core/ext/filters/client_channel/client_channel_service_config.h +3 -3
  20. data/src/core/ext/filters/client_channel/config_selector.h +3 -3
  21. data/src/core/ext/filters/client_channel/connector.h +8 -4
  22. data/src/core/ext/filters/client_channel/dynamic_filters.h +3 -3
  23. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +3 -3
  24. data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
  25. data/src/core/ext/filters/client_channel/http_proxy.h +3 -3
  26. data/src/core/ext/filters/client_channel/lb_call_state_internal.h +3 -3
  27. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +3 -3
  28. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +3 -3
  29. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +3 -3
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +14 -7
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +3 -3
  32. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +1 -0
  33. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +3 -3
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +3 -3
  35. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +3 -3
  36. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +3 -3
  37. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +1 -78
  38. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +3 -3
  39. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric_internal.h +117 -0
  40. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +3 -3
  41. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +3 -3
  42. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +1 -0
  43. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +3 -3
  44. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/static_stride_scheduler.cc +128 -0
  45. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/static_stride_scheduler.h +71 -0
  46. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +972 -0
  47. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +3 -6
  48. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.h +3 -3
  49. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +3 -3
  50. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +12 -7
  51. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +275 -107
  52. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +10 -3
  53. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +5 -0
  54. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +3 -3
  55. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +3 -3
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +6 -1
  57. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +1 -2
  58. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +3 -3
  59. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +3 -3
  60. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +3 -3
  61. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +1 -0
  62. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +3 -3
  63. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +3 -7
  64. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +3 -3
  65. data/src/core/ext/filters/client_channel/retry_filter.cc +10 -13
  66. data/src/core/ext/filters/client_channel/retry_filter.h +3 -3
  67. data/src/core/ext/filters/client_channel/retry_service_config.h +3 -3
  68. data/src/core/ext/filters/client_channel/retry_throttle.h +3 -3
  69. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +4 -4
  70. data/src/core/ext/filters/client_channel/subchannel.cc +5 -1
  71. data/src/core/ext/filters/client_channel/subchannel.h +3 -3
  72. data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +3 -3
  73. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +3 -3
  74. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +3 -3
  75. data/src/core/ext/filters/deadline/deadline_filter.cc +40 -48
  76. data/src/core/ext/filters/deadline/deadline_filter.h +6 -10
  77. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +3 -3
  78. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h +3 -3
  79. data/src/core/ext/filters/http/client/http_client_filter.cc +26 -21
  80. data/src/core/ext/filters/http/client/http_client_filter.h +3 -3
  81. data/src/core/ext/filters/http/client_authority_filter.h +3 -3
  82. data/src/core/ext/filters/http/message_compress/compression_filter.cc +109 -117
  83. data/src/core/ext/filters/http/message_compress/compression_filter.h +17 -10
  84. data/src/core/ext/filters/http/server/http_server_filter.cc +25 -24
  85. data/src/core/ext/filters/http/server/http_server_filter.h +3 -3
  86. data/src/core/ext/filters/message_size/message_size_filter.cc +2 -1
  87. data/src/core/ext/filters/message_size/message_size_filter.h +3 -3
  88. data/src/core/ext/filters/rbac/rbac_filter.cc +4 -3
  89. data/src/core/ext/filters/rbac/rbac_filter.h +3 -3
  90. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +3 -3
  91. data/src/core/ext/filters/server_config_selector/server_config_selector.h +3 -3
  92. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +3 -3
  93. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +27 -37
  94. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +5 -5
  95. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +3 -3
  96. data/src/core/ext/transport/chttp2/alpn/alpn.h +3 -3
  97. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -7
  98. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +3 -3
  99. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +1 -0
  100. data/src/core/ext/transport/chttp2/server/chttp2_server.h +3 -3
  101. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +3 -3
  102. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +3 -3
  103. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +195 -111
  104. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -3
  105. data/src/core/ext/transport/chttp2/transport/context_list.h +3 -3
  106. data/src/core/ext/transport/chttp2/transport/decode_huff.h +3 -3
  107. data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -0
  108. data/src/core/ext/transport/chttp2/transport/flow_control.h +3 -3
  109. data/src/core/ext/transport/chttp2/transport/frame.h +3 -3
  110. data/src/core/ext/transport/chttp2/transport/frame_data.cc +2 -0
  111. data/src/core/ext/transport/chttp2/transport/frame_data.h +3 -3
  112. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -0
  113. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -3
  114. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +1 -0
  115. data/src/core/ext/transport/chttp2/transport/frame_ping.h +3 -3
  116. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -0
  117. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +3 -3
  118. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +1 -0
  119. data/src/core/ext/transport/chttp2/transport/frame_settings.h +3 -3
  120. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +2 -0
  121. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +3 -3
  122. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +3 -3
  123. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +3 -3
  124. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +3 -3
  125. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +18 -407
  126. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +3 -3
  127. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +1 -0
  128. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +3 -3
  129. data/src/core/ext/transport/chttp2/transport/http2_settings.h +3 -3
  130. data/src/core/ext/transport/chttp2/transport/http_trace.h +3 -3
  131. data/src/core/ext/transport/chttp2/transport/huffsyms.h +3 -3
  132. data/src/core/ext/transport/chttp2/transport/internal.h +28 -23
  133. data/src/core/ext/transport/chttp2/transport/parsing.cc +111 -31
  134. data/src/core/ext/transport/chttp2/transport/stream_map.h +3 -3
  135. data/src/core/ext/transport/chttp2/transport/varint.h +3 -3
  136. data/src/core/ext/transport/chttp2/transport/writing.cc +9 -8
  137. data/src/core/ext/transport/inproc/inproc_transport.h +3 -3
  138. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.c +3 -2
  139. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.h +9 -0
  140. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.c +38 -2
  141. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.h +185 -0
  142. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +7 -3
  143. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +44 -0
  144. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +16 -25
  145. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +48 -74
  146. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +30 -7
  147. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +137 -0
  148. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +15 -12
  149. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +83 -51
  150. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +3 -2
  151. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +15 -0
  152. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +17 -2
  153. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +61 -0
  154. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +11 -5
  155. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +37 -6
  156. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +5 -3
  157. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +24 -0
  158. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +5 -3
  159. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +22 -0
  160. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +6 -3
  161. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +24 -0
  162. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +24 -5
  163. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +50 -0
  164. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +57 -16
  165. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +254 -17
  166. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.c +3 -2
  167. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.h +9 -0
  168. data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.c +3 -2
  169. data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.h +9 -0
  170. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.c +7 -6
  171. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.h +21 -12
  172. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +6 -3
  173. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +23 -0
  174. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +10 -7
  175. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +42 -12
  176. 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
  177. 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
  178. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/common/v3/common.upb.c +111 -0
  179. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/common/v3/common.upb.h +444 -0
  180. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +7 -3
  181. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +24 -0
  182. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +8 -6
  183. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +31 -9
  184. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +5 -3
  185. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +24 -0
  186. data/src/core/ext/upb-generated/envoy/type/matcher/v3/filter_state.upb.c +47 -0
  187. data/src/core/ext/upb-generated/envoy/type/matcher/v3/filter_state.upb.h +113 -0
  188. data/src/core/ext/upb-generated/envoy/type/matcher/v3/status_code_input.upb.c +43 -0
  189. data/src/core/ext/upb-generated/envoy/type/matcher/v3/status_code_input.upb.h +114 -0
  190. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_unit.upb.h +3 -1
  191. data/src/core/ext/upbdefs-generated/envoy/admin/v3/clusters.upbdefs.c +54 -53
  192. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.c +34 -13
  193. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.h +10 -0
  194. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +195 -187
  195. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +232 -224
  196. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +0 -5
  197. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +95 -75
  198. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h +5 -0
  199. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +94 -93
  200. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +81 -75
  201. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +189 -187
  202. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +7 -3
  203. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h +5 -0
  204. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +71 -66
  205. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +137 -133
  206. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +16 -12
  207. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +140 -133
  208. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +81 -70
  209. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +5 -0
  210. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +771 -741
  211. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +10 -0
  212. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/datadog.upbdefs.c +16 -14
  213. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.c +14 -13
  214. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/zipkin.upbdefs.c +20 -18
  215. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +53 -42
  216. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +363 -356
  217. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +149 -145
  218. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +16 -13
  219. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/filter_state.upbdefs.c +48 -0
  220. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/filter_state.upbdefs.h +35 -0
  221. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +14 -14
  222. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/status_code_input.upbdefs.c +40 -0
  223. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/status_code_input.upbdefs.h +40 -0
  224. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_unit.upbdefs.c +10 -9
  225. data/src/core/ext/xds/certificate_provider_store.h +3 -3
  226. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +1 -0
  227. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +3 -3
  228. data/src/core/ext/xds/upb_utils.h +3 -3
  229. data/src/core/ext/xds/xds_api.h +3 -3
  230. data/src/core/ext/xds/xds_bootstrap.h +3 -3
  231. data/src/core/ext/xds/xds_bootstrap_grpc.cc +1 -0
  232. data/src/core/ext/xds/xds_bootstrap_grpc.h +3 -3
  233. data/src/core/ext/xds/xds_certificate_provider.h +3 -3
  234. data/src/core/ext/xds/xds_channel_args.h +3 -3
  235. data/src/core/ext/xds/xds_channel_stack_modifier.h +3 -3
  236. data/src/core/ext/xds/xds_client.cc +8 -3
  237. data/src/core/ext/xds/xds_client.h +3 -3
  238. data/src/core/ext/xds/xds_client_grpc.cc +0 -1
  239. data/src/core/ext/xds/xds_client_grpc.h +3 -3
  240. data/src/core/ext/xds/xds_client_stats.h +4 -3
  241. data/src/core/ext/xds/xds_cluster.cc +11 -7
  242. data/src/core/ext/xds/xds_cluster.h +6 -6
  243. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +3 -3
  244. data/src/core/ext/xds/xds_common_types.cc +1 -0
  245. data/src/core/ext/xds/xds_common_types.h +3 -3
  246. data/src/core/ext/xds/xds_endpoint.cc +1 -1
  247. data/src/core/ext/xds/xds_endpoint.h +3 -3
  248. data/src/core/ext/xds/xds_health_status.h +30 -3
  249. data/src/core/ext/xds/xds_http_fault_filter.h +3 -3
  250. data/src/core/ext/xds/xds_http_filters.cc +1 -1
  251. data/src/core/ext/xds/xds_http_filters.h +3 -3
  252. data/src/core/ext/xds/xds_http_rbac_filter.h +3 -3
  253. data/src/core/ext/xds/xds_http_stateful_session_filter.h +3 -3
  254. data/src/core/ext/xds/xds_lb_policy_registry.cc +95 -0
  255. data/src/core/ext/xds/xds_lb_policy_registry.h +3 -3
  256. data/src/core/ext/xds/xds_listener.cc +1 -0
  257. data/src/core/ext/xds/xds_listener.h +3 -3
  258. data/src/core/ext/xds/xds_resource_type.h +3 -3
  259. data/src/core/ext/xds/xds_resource_type_impl.h +3 -3
  260. data/src/core/ext/xds/xds_route_config.cc +6 -0
  261. data/src/core/ext/xds/xds_route_config.h +3 -3
  262. data/src/core/ext/xds/xds_routing.h +3 -3
  263. data/src/core/ext/xds/xds_transport.h +3 -3
  264. data/src/core/ext/xds/xds_transport_grpc.h +3 -3
  265. data/src/core/lib/address_utils/parse_address.h +3 -3
  266. data/src/core/lib/address_utils/sockaddr_utils.cc +1 -0
  267. data/src/core/lib/address_utils/sockaddr_utils.h +3 -3
  268. data/src/core/lib/avl/avl.h +3 -3
  269. data/src/core/lib/backoff/backoff.h +3 -3
  270. data/src/core/lib/channel/call_finalization.h +3 -3
  271. data/src/core/lib/channel/call_tracer.h +3 -3
  272. data/src/core/lib/channel/channel_args.cc +1 -0
  273. data/src/core/lib/channel/channel_args.h +11 -5
  274. data/src/core/lib/channel/channel_args_preconditioning.h +3 -3
  275. data/src/core/lib/channel/channel_fwd.h +3 -3
  276. data/src/core/lib/channel/channel_stack.cc +1 -2
  277. data/src/core/lib/channel/channel_stack.h +4 -4
  278. data/src/core/lib/channel/channel_stack_builder.h +3 -3
  279. data/src/core/lib/channel/channel_stack_builder_impl.cc +14 -1
  280. data/src/core/lib/channel/channel_stack_builder_impl.h +3 -3
  281. data/src/core/lib/channel/channel_trace.h +3 -3
  282. data/src/core/lib/channel/channelz.h +3 -3
  283. data/src/core/lib/channel/channelz_registry.h +3 -3
  284. data/src/core/lib/channel/connected_channel.cc +883 -354
  285. data/src/core/lib/channel/connected_channel.h +3 -3
  286. data/src/core/lib/channel/context.h +7 -3
  287. data/src/core/lib/channel/promise_based_filter.cc +532 -260
  288. data/src/core/lib/channel/promise_based_filter.h +124 -44
  289. data/src/core/lib/channel/status_util.h +3 -3
  290. data/src/core/lib/compression/compression_internal.h +3 -3
  291. data/src/core/lib/compression/message_compress.h +3 -3
  292. data/src/core/lib/config/core_configuration.h +3 -3
  293. data/src/core/lib/debug/event_log.h +3 -3
  294. data/src/core/lib/debug/histogram_view.h +3 -3
  295. data/src/core/lib/debug/stats.h +3 -3
  296. data/src/core/lib/debug/stats_data.cc +66 -65
  297. data/src/core/lib/debug/stats_data.h +42 -33
  298. data/src/core/lib/debug/trace.h +4 -26
  299. data/src/core/lib/event_engine/channel_args_endpoint_config.cc +5 -0
  300. data/src/core/lib/event_engine/channel_args_endpoint_config.h +3 -3
  301. data/src/core/lib/event_engine/common_closures.h +3 -3
  302. data/src/core/lib/event_engine/default_event_engine.cc +9 -4
  303. data/src/core/lib/event_engine/default_event_engine.h +30 -6
  304. data/src/core/lib/event_engine/default_event_engine_factory.h +3 -3
  305. data/src/core/lib/event_engine/event_engine.cc +25 -0
  306. data/src/core/lib/event_engine/executor/executor.h +3 -3
  307. data/src/core/lib/event_engine/forkable.cc +11 -6
  308. data/src/core/lib/event_engine/forkable.h +3 -3
  309. data/src/core/lib/event_engine/handle_containers.h +10 -3
  310. data/src/core/lib/event_engine/poller.h +3 -3
  311. data/src/core/lib/event_engine/posix.h +158 -0
  312. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +44 -16
  313. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +14 -4
  314. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +6 -7
  315. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +3 -3
  316. data/src/core/lib/event_engine/posix_engine/event_poller.h +3 -3
  317. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.h +3 -3
  318. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +3 -3
  319. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +3 -3
  320. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +52 -55
  321. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +46 -13
  322. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +82 -12
  323. data/src/core/lib/event_engine/posix_engine/posix_engine.h +23 -9
  324. data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +3 -3
  325. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +60 -7
  326. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +65 -14
  327. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +0 -1
  328. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +6 -6
  329. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +3 -3
  330. data/src/core/lib/event_engine/posix_engine/timer.h +3 -3
  331. data/src/core/lib/event_engine/posix_engine/timer_heap.h +3 -3
  332. data/src/core/lib/event_engine/posix_engine/timer_manager.h +3 -3
  333. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +3 -3
  334. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +3 -3
  335. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +3 -3
  336. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +3 -3
  337. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +3 -3
  338. data/src/core/lib/event_engine/resolved_address.cc +19 -0
  339. data/src/core/lib/event_engine/resolved_address_internal.h +34 -0
  340. data/src/core/lib/event_engine/shim.cc +56 -0
  341. data/src/core/lib/event_engine/shim.h +33 -0
  342. data/src/core/lib/event_engine/slice.cc +1 -1
  343. data/src/core/lib/event_engine/tcp_socket_utils.cc +18 -2
  344. data/src/core/lib/event_engine/tcp_socket_utils.h +8 -3
  345. data/src/core/lib/event_engine/thread_local.cc +29 -0
  346. data/src/core/lib/event_engine/thread_local.h +32 -0
  347. data/src/core/lib/event_engine/thread_pool.cc +41 -65
  348. data/src/core/lib/event_engine/thread_pool.h +21 -17
  349. data/src/core/lib/event_engine/time_util.h +3 -3
  350. data/src/core/lib/event_engine/trace.cc +6 -0
  351. data/src/core/lib/event_engine/trace.h +16 -3
  352. data/src/core/lib/event_engine/utils.cc +2 -2
  353. data/src/core/lib/event_engine/utils.h +12 -4
  354. data/src/core/lib/event_engine/windows/iocp.cc +24 -40
  355. data/src/core/lib/event_engine/windows/iocp.h +3 -3
  356. data/src/core/lib/event_engine/windows/win_socket.cc +56 -33
  357. data/src/core/lib/event_engine/windows/win_socket.h +34 -25
  358. data/src/core/lib/event_engine/windows/windows_endpoint.cc +331 -0
  359. data/src/core/lib/event_engine/windows/windows_endpoint.h +103 -0
  360. data/src/core/lib/event_engine/windows/windows_engine.cc +243 -20
  361. data/src/core/lib/event_engine/windows/windows_engine.h +62 -23
  362. data/src/core/lib/experiments/config.cc +16 -1
  363. data/src/core/lib/experiments/config.h +13 -3
  364. data/src/core/lib/experiments/experiments.cc +14 -8
  365. data/src/core/lib/experiments/experiments.h +80 -21
  366. data/src/core/lib/gpr/alloc.h +3 -3
  367. data/src/core/lib/gpr/spinlock.h +3 -3
  368. data/src/core/lib/gpr/string.h +3 -3
  369. data/src/core/lib/gpr/sync_abseil.cc +15 -7
  370. data/src/core/lib/gpr/time_precise.h +3 -3
  371. data/src/core/lib/gpr/tmpfile.h +3 -3
  372. data/src/core/lib/gpr/useful.h +3 -3
  373. data/src/core/lib/gprpp/atomic_utils.h +3 -3
  374. data/src/core/lib/gprpp/bitset.h +3 -3
  375. data/src/core/lib/gprpp/chunked_vector.h +3 -3
  376. data/src/core/lib/gprpp/construct_destruct.h +3 -3
  377. data/src/core/lib/gprpp/cpp_impl_of.h +3 -3
  378. data/src/core/lib/gprpp/crash.h +3 -3
  379. data/src/core/lib/gprpp/debug_location.h +3 -6
  380. data/src/core/lib/gprpp/dual_ref_counted.h +3 -3
  381. data/src/core/lib/gprpp/env.h +3 -3
  382. data/src/core/lib/gprpp/examine_stack.h +3 -3
  383. data/src/core/lib/gprpp/fork.cc +21 -4
  384. data/src/core/lib/gprpp/fork.h +7 -5
  385. data/src/core/lib/gprpp/global_config.h +3 -3
  386. data/src/core/lib/gprpp/global_config_custom.h +3 -3
  387. data/src/core/lib/gprpp/global_config_env.cc +1 -0
  388. data/src/core/lib/gprpp/global_config_env.h +3 -3
  389. data/src/core/lib/gprpp/global_config_generic.h +3 -3
  390. data/src/core/lib/gprpp/host_port.cc +2 -0
  391. data/src/core/lib/gprpp/host_port.h +3 -3
  392. data/src/core/lib/gprpp/load_file.h +3 -3
  393. data/src/core/lib/gprpp/manual_constructor.h +3 -3
  394. data/src/core/lib/gprpp/match.h +3 -3
  395. data/src/core/lib/gprpp/memory.h +3 -3
  396. data/src/core/lib/gprpp/mpscq.h +3 -3
  397. data/src/core/lib/gprpp/no_destruct.h +3 -3
  398. data/src/core/lib/gprpp/notification.h +3 -3
  399. data/src/core/lib/gprpp/orphanable.h +3 -3
  400. data/src/core/lib/gprpp/overload.h +3 -3
  401. data/src/core/lib/gprpp/packed_table.h +3 -3
  402. data/src/core/lib/gprpp/per_cpu.h +3 -3
  403. data/src/core/lib/gprpp/ref_counted.h +3 -3
  404. data/src/core/lib/gprpp/ref_counted_ptr.h +3 -3
  405. data/src/core/lib/gprpp/single_set_ptr.h +3 -3
  406. data/src/core/lib/gprpp/sorted_pack.h +3 -3
  407. data/src/core/lib/gprpp/stat.h +3 -3
  408. data/src/core/lib/gprpp/status_helper.h +3 -3
  409. data/src/core/lib/gprpp/strerror.cc +2 -0
  410. data/src/core/lib/gprpp/strerror.h +3 -3
  411. data/src/core/lib/gprpp/sync.h +3 -3
  412. data/src/core/lib/gprpp/table.h +3 -3
  413. data/src/core/lib/gprpp/tchar.h +3 -3
  414. data/src/core/lib/gprpp/thd.h +3 -3
  415. data/src/core/lib/gprpp/time.cc +1 -0
  416. data/src/core/lib/gprpp/time.h +3 -3
  417. data/src/core/lib/gprpp/time_averaged_stats.h +3 -3
  418. data/src/core/lib/gprpp/time_util.h +3 -3
  419. data/src/core/lib/gprpp/unique_type_name.h +3 -3
  420. data/src/core/lib/gprpp/validation_errors.h +3 -3
  421. data/src/core/lib/gprpp/work_serializer.h +3 -3
  422. data/src/core/lib/handshaker/proxy_mapper.h +3 -3
  423. data/src/core/lib/handshaker/proxy_mapper_registry.h +3 -3
  424. data/src/core/lib/http/format_request.cc +1 -0
  425. data/src/core/lib/http/format_request.h +3 -3
  426. data/src/core/lib/http/httpcli.cc +1 -0
  427. data/src/core/lib/http/httpcli.h +3 -3
  428. data/src/core/lib/http/httpcli_ssl_credentials.h +3 -3
  429. data/src/core/lib/http/parser.h +3 -3
  430. data/src/core/lib/iomgr/block_annotate.h +3 -3
  431. data/src/core/lib/iomgr/buffer_list.h +3 -3
  432. data/src/core/lib/iomgr/call_combiner.cc +4 -4
  433. data/src/core/lib/iomgr/call_combiner.h +3 -3
  434. data/src/core/lib/iomgr/cfstream_handle.h +3 -3
  435. data/src/core/lib/iomgr/closure.cc +27 -0
  436. data/src/core/lib/iomgr/closure.h +5 -3
  437. data/src/core/lib/iomgr/combiner.h +3 -3
  438. data/src/core/lib/iomgr/dynamic_annotations.h +3 -3
  439. data/src/core/lib/iomgr/endpoint.h +3 -3
  440. data/src/core/lib/iomgr/endpoint_cfstream.h +3 -3
  441. data/src/core/lib/iomgr/endpoint_pair.h +3 -3
  442. data/src/core/lib/iomgr/endpoint_pair_windows.cc +10 -2
  443. data/src/core/lib/iomgr/error.h +3 -3
  444. data/src/core/lib/iomgr/error_cfstream.h +3 -3
  445. data/src/core/lib/iomgr/ev_apple.h +3 -3
  446. data/src/core/lib/iomgr/ev_epoll1_linux.h +3 -3
  447. data/src/core/lib/iomgr/ev_poll_posix.h +3 -3
  448. data/src/core/lib/iomgr/ev_posix.h +3 -3
  449. data/src/core/lib/iomgr/event_engine_shims/closure.cc +62 -0
  450. data/src/core/lib/iomgr/event_engine_shims/closure.h +39 -0
  451. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +430 -0
  452. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +43 -0
  453. data/src/core/lib/iomgr/event_engine_shims/tcp_client.cc +91 -0
  454. data/src/core/lib/iomgr/event_engine_shims/tcp_client.h +44 -0
  455. data/src/core/lib/iomgr/exec_ctx.h +3 -3
  456. data/src/core/lib/iomgr/executor.h +3 -3
  457. data/src/core/lib/iomgr/fork_posix.cc +5 -4
  458. data/src/core/lib/iomgr/gethostname.h +3 -3
  459. data/src/core/lib/iomgr/grpc_if_nametoindex.h +3 -3
  460. data/src/core/lib/iomgr/internal_errqueue.h +3 -3
  461. data/src/core/lib/iomgr/iocp_windows.h +3 -3
  462. data/src/core/lib/iomgr/iomgr.h +3 -3
  463. data/src/core/lib/iomgr/iomgr_fwd.h +3 -3
  464. data/src/core/lib/iomgr/iomgr_internal.h +3 -3
  465. data/src/core/lib/iomgr/load_file.h +3 -3
  466. data/src/core/lib/iomgr/lockfree_event.h +3 -3
  467. data/src/core/lib/iomgr/nameser.h +3 -3
  468. data/src/core/lib/iomgr/polling_entity.h +3 -3
  469. data/src/core/lib/iomgr/pollset.h +3 -3
  470. data/src/core/lib/iomgr/pollset_set.h +3 -3
  471. data/src/core/lib/iomgr/pollset_set_windows.h +3 -3
  472. data/src/core/lib/iomgr/pollset_windows.cc +2 -2
  473. data/src/core/lib/iomgr/pollset_windows.h +3 -3
  474. data/src/core/lib/iomgr/port.h +3 -3
  475. data/src/core/lib/iomgr/python_util.h +3 -3
  476. data/src/core/lib/iomgr/resolve_address.h +3 -3
  477. data/src/core/lib/iomgr/resolve_address_impl.h +3 -3
  478. data/src/core/lib/iomgr/resolve_address_posix.h +3 -3
  479. data/src/core/lib/iomgr/resolve_address_windows.h +3 -3
  480. data/src/core/lib/iomgr/resolved_address.h +3 -3
  481. data/src/core/lib/iomgr/sockaddr.h +3 -3
  482. data/src/core/lib/iomgr/sockaddr_posix.h +3 -3
  483. data/src/core/lib/iomgr/sockaddr_windows.h +3 -3
  484. data/src/core/lib/iomgr/socket_factory_posix.h +3 -3
  485. data/src/core/lib/iomgr/socket_mutator.h +3 -3
  486. data/src/core/lib/iomgr/socket_utils.h +3 -3
  487. data/src/core/lib/iomgr/socket_utils_posix.h +3 -3
  488. data/src/core/lib/iomgr/socket_windows.h +3 -3
  489. data/src/core/lib/iomgr/systemd_utils.cc +19 -19
  490. data/src/core/lib/iomgr/systemd_utils.h +24 -24
  491. data/src/core/lib/iomgr/tcp_client.h +3 -3
  492. data/src/core/lib/iomgr/tcp_client_posix.cc +12 -0
  493. data/src/core/lib/iomgr/tcp_client_posix.h +3 -3
  494. data/src/core/lib/iomgr/tcp_client_windows.cc +13 -1
  495. data/src/core/lib/iomgr/tcp_posix.cc +49 -65
  496. data/src/core/lib/iomgr/tcp_posix.h +3 -3
  497. data/src/core/lib/iomgr/tcp_server.h +3 -3
  498. data/src/core/lib/iomgr/tcp_server_posix.cc +219 -4
  499. data/src/core/lib/iomgr/tcp_server_utils_posix.h +13 -3
  500. data/src/core/lib/iomgr/tcp_server_windows.cc +4 -6
  501. data/src/core/lib/iomgr/tcp_windows.h +3 -3
  502. data/src/core/lib/iomgr/timer.h +3 -3
  503. data/src/core/lib/iomgr/timer_generic.h +3 -3
  504. data/src/core/lib/iomgr/timer_heap.h +3 -3
  505. data/src/core/lib/iomgr/timer_manager.h +3 -3
  506. data/src/core/lib/iomgr/unix_sockets_posix.h +3 -3
  507. data/src/core/lib/iomgr/wakeup_fd_pipe.h +3 -3
  508. data/src/core/lib/iomgr/wakeup_fd_posix.h +3 -3
  509. data/src/core/lib/json/json.h +3 -3
  510. data/src/core/lib/json/json_args.h +3 -3
  511. data/src/core/lib/json/json_channel_args.h +3 -3
  512. data/src/core/lib/json/json_object_loader.h +3 -3
  513. data/src/core/lib/json/json_reader.cc +1 -0
  514. data/src/core/lib/json/json_util.h +3 -3
  515. data/src/core/lib/load_balancing/lb_policy.cc +9 -0
  516. data/src/core/lib/load_balancing/lb_policy.h +9 -5
  517. data/src/core/lib/load_balancing/lb_policy_factory.h +3 -3
  518. data/src/core/lib/load_balancing/lb_policy_registry.cc +1 -0
  519. data/src/core/lib/load_balancing/lb_policy_registry.h +3 -3
  520. data/src/core/lib/load_balancing/subchannel_interface.h +8 -6
  521. data/src/core/lib/matchers/matchers.cc +1 -0
  522. data/src/core/lib/matchers/matchers.h +3 -3
  523. data/src/core/lib/promise/activity.cc +8 -6
  524. data/src/core/lib/promise/activity.h +52 -66
  525. data/src/core/lib/promise/arena_promise.h +3 -3
  526. data/src/core/lib/promise/context.h +3 -3
  527. data/src/core/lib/promise/detail/basic_join.h +197 -0
  528. data/src/core/lib/promise/detail/basic_seq.h +10 -16
  529. data/src/core/lib/promise/detail/promise_factory.h +3 -3
  530. data/src/core/lib/promise/detail/promise_like.h +3 -3
  531. data/src/core/lib/promise/detail/status.h +3 -3
  532. data/src/core/lib/promise/detail/switch.h +3 -3
  533. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +3 -3
  534. data/src/core/lib/promise/if.h +195 -0
  535. data/src/core/lib/promise/interceptor_list.h +308 -0
  536. data/src/core/lib/promise/intra_activity_waiter.h +9 -3
  537. data/src/core/lib/promise/latch.h +99 -5
  538. data/src/core/lib/promise/loop.h +4 -4
  539. data/src/core/lib/promise/map.h +4 -6
  540. data/src/core/lib/promise/pipe.h +296 -193
  541. data/src/core/lib/promise/poll.h +113 -14
  542. data/src/core/lib/promise/promise.h +4 -5
  543. data/src/core/lib/promise/race.h +6 -9
  544. data/src/core/lib/promise/seq.h +3 -3
  545. data/src/core/lib/promise/sleep.h +3 -3
  546. data/src/core/lib/promise/{pipe.cc → trace.cc} +3 -2
  547. data/src/core/lib/promise/trace.h +24 -0
  548. data/src/core/lib/promise/try_join.h +82 -0
  549. data/src/core/lib/promise/try_seq.h +3 -3
  550. data/src/core/lib/resolver/resolver.h +3 -3
  551. data/src/core/lib/resolver/resolver_factory.h +4 -4
  552. data/src/core/lib/resolver/resolver_registry.cc +15 -0
  553. data/src/core/lib/resolver/resolver_registry.h +3 -3
  554. data/src/core/lib/resolver/server_address.cc +1 -0
  555. data/src/core/lib/resolver/server_address.h +3 -3
  556. data/src/core/lib/resource_quota/api.h +3 -3
  557. data/src/core/lib/resource_quota/arena.cc +36 -9
  558. data/src/core/lib/resource_quota/arena.h +84 -22
  559. data/src/core/lib/resource_quota/memory_quota.h +3 -3
  560. data/src/core/lib/resource_quota/periodic_update.h +3 -3
  561. data/src/core/lib/resource_quota/resource_quota.h +3 -3
  562. data/src/core/lib/resource_quota/thread_quota.h +3 -3
  563. data/src/core/lib/resource_quota/trace.h +3 -3
  564. data/src/core/lib/security/authorization/authorization_engine.h +3 -3
  565. data/src/core/lib/security/authorization/authorization_policy_provider.h +3 -3
  566. data/src/core/lib/security/authorization/evaluate_args.h +3 -3
  567. data/src/core/lib/security/authorization/grpc_authorization_engine.h +3 -3
  568. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +3 -3
  569. data/src/core/lib/security/authorization/matchers.h +3 -3
  570. data/src/core/lib/security/authorization/rbac_policy.cc +1 -0
  571. data/src/core/lib/security/authorization/rbac_policy.h +3 -3
  572. data/src/core/lib/security/certificate_provider/certificate_provider_factory.h +3 -3
  573. data/src/core/lib/security/certificate_provider/certificate_provider_registry.h +3 -3
  574. data/src/core/lib/security/context/security_context.h +3 -3
  575. data/src/core/lib/security/credentials/alts/alts_credentials.h +3 -3
  576. data/src/core/lib/security/credentials/alts/check_gcp_environment.h +3 -3
  577. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h +3 -3
  578. data/src/core/lib/security/credentials/call_creds_util.h +3 -3
  579. data/src/core/lib/security/credentials/channel_creds_registry.h +3 -3
  580. data/src/core/lib/security/credentials/composite/composite_credentials.h +3 -3
  581. data/src/core/lib/security/credentials/credentials.h +3 -3
  582. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +1 -0
  583. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +3 -3
  584. data/src/core/lib/security/credentials/external/aws_request_signer.cc +1 -0
  585. data/src/core/lib/security/credentials/external/aws_request_signer.h +3 -3
  586. data/src/core/lib/security/credentials/external/external_account_credentials.cc +1 -0
  587. data/src/core/lib/security/credentials/external/external_account_credentials.h +3 -3
  588. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +3 -3
  589. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +1 -0
  590. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +3 -3
  591. data/src/core/lib/security/credentials/fake/fake_credentials.h +3 -3
  592. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +3 -3
  593. data/src/core/lib/security/credentials/iam/iam_credentials.cc +1 -0
  594. data/src/core/lib/security/credentials/iam/iam_credentials.h +3 -3
  595. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +3 -3
  596. data/src/core/lib/security/credentials/jwt/json_token.h +3 -3
  597. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +4 -3
  598. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +3 -3
  599. data/src/core/lib/security/credentials/local/local_credentials.h +3 -3
  600. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +4 -3
  601. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +3 -3
  602. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +3 -3
  603. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +3 -3
  604. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +1 -1
  605. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +3 -3
  606. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +3 -3
  607. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +3 -3
  608. data/src/core/lib/security/credentials/tls/tls_credentials.h +3 -3
  609. data/src/core/lib/security/credentials/tls/tls_utils.h +3 -3
  610. data/src/core/lib/security/credentials/xds/xds_credentials.h +3 -3
  611. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +3 -3
  612. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +1 -0
  613. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +3 -3
  614. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +3 -3
  615. data/src/core/lib/security/security_connector/load_system_roots.h +3 -3
  616. data/src/core/lib/security/security_connector/load_system_roots_supported.h +3 -3
  617. data/src/core/lib/security/security_connector/local/local_security_connector.h +3 -3
  618. data/src/core/lib/security/security_connector/security_connector.h +3 -3
  619. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +1 -0
  620. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +3 -3
  621. data/src/core/lib/security/security_connector/ssl_utils.h +3 -3
  622. data/src/core/lib/security/security_connector/ssl_utils_config.h +3 -3
  623. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +3 -3
  624. data/src/core/lib/security/transport/auth_filters.h +27 -5
  625. data/src/core/lib/security/transport/secure_endpoint.h +3 -3
  626. data/src/core/lib/security/transport/security_handshaker.cc +9 -0
  627. data/src/core/lib/security/transport/security_handshaker.h +3 -3
  628. data/src/core/lib/security/transport/server_auth_filter.cc +120 -251
  629. data/src/core/lib/security/transport/tsi_error.h +3 -3
  630. data/src/core/lib/security/util/json_util.h +3 -3
  631. data/src/core/lib/service_config/service_config.h +3 -3
  632. data/src/core/lib/service_config/service_config_call_data.h +3 -3
  633. data/src/core/lib/service_config/service_config_impl.h +3 -3
  634. data/src/core/lib/service_config/service_config_parser.h +3 -3
  635. data/src/core/lib/slice/b64.h +3 -3
  636. data/src/core/lib/slice/percent_encoding.h +3 -3
  637. data/src/core/lib/slice/slice.cc +3 -3
  638. data/src/core/lib/slice/slice.h +14 -21
  639. data/src/core/lib/slice/slice_buffer.h +10 -4
  640. data/src/core/lib/slice/slice_internal.h +3 -3
  641. data/src/core/lib/slice/slice_refcount.cc +20 -0
  642. data/src/core/lib/slice/slice_refcount.h +26 -6
  643. data/src/core/lib/slice/slice_string_helpers.h +3 -3
  644. data/src/core/lib/surface/api_trace.h +3 -3
  645. data/src/core/lib/surface/builtins.h +3 -3
  646. data/src/core/lib/surface/call.cc +866 -252
  647. data/src/core/lib/surface/call.h +31 -3
  648. data/src/core/lib/surface/call_log_batch.cc +1 -0
  649. data/src/core/lib/surface/call_test_only.h +3 -3
  650. data/src/core/lib/surface/call_trace.cc +21 -11
  651. data/src/core/lib/surface/call_trace.h +3 -3
  652. data/src/core/lib/surface/channel.h +3 -3
  653. data/src/core/lib/surface/channel_init.h +3 -3
  654. data/src/core/lib/surface/channel_stack_type.h +3 -3
  655. data/src/core/lib/surface/completion_queue.cc +1 -0
  656. data/src/core/lib/surface/completion_queue.h +3 -3
  657. data/src/core/lib/surface/completion_queue_factory.h +3 -3
  658. data/src/core/lib/surface/event_string.cc +1 -0
  659. data/src/core/lib/surface/event_string.h +3 -3
  660. data/src/core/lib/surface/init.cc +1 -1
  661. data/src/core/lib/surface/init.h +3 -3
  662. data/src/core/lib/surface/init_internally.h +3 -3
  663. data/src/core/lib/surface/lame_client.cc +3 -1
  664. data/src/core/lib/surface/lame_client.h +3 -3
  665. data/src/core/lib/surface/server.cc +273 -27
  666. data/src/core/lib/surface/server.h +6 -3
  667. data/src/core/lib/surface/validate_metadata.h +3 -3
  668. data/src/core/lib/surface/version.cc +2 -2
  669. data/src/core/lib/transport/bdp_estimator.h +3 -3
  670. data/src/core/lib/transport/connectivity_state.h +3 -3
  671. data/src/core/lib/transport/error_utils.h +3 -3
  672. data/src/core/lib/transport/handshaker.cc +11 -0
  673. data/src/core/lib/transport/handshaker.h +4 -4
  674. data/src/core/lib/transport/handshaker_factory.h +3 -3
  675. data/src/core/lib/transport/handshaker_registry.h +3 -3
  676. data/src/core/lib/transport/http2_errors.h +3 -3
  677. data/src/core/lib/transport/http_connect_handshaker.h +3 -3
  678. data/src/core/lib/transport/metadata_batch.cc +11 -0
  679. data/src/core/lib/transport/metadata_batch.h +24 -3
  680. data/src/core/lib/transport/parsed_metadata.h +3 -3
  681. data/src/core/lib/transport/pid_controller.h +3 -3
  682. data/src/core/lib/transport/status_conversion.h +3 -3
  683. data/src/core/lib/transport/tcp_connect_handshaker.cc +0 -1
  684. data/src/core/lib/transport/tcp_connect_handshaker.h +3 -3
  685. data/src/core/lib/transport/timeout_encoding.h +3 -3
  686. data/src/core/lib/transport/transport.cc +3 -8
  687. data/src/core/lib/transport/transport.h +16 -8
  688. data/src/core/lib/transport/transport_fwd.h +3 -3
  689. data/src/core/lib/transport/transport_impl.h +3 -3
  690. data/src/core/lib/transport/transport_op_string.cc +1 -0
  691. data/src/core/lib/uri/uri_parser.cc +1 -1
  692. data/src/core/lib/uri/uri_parser.h +3 -3
  693. data/src/core/plugin_registry/grpc_plugin_registry.cc +5 -0
  694. data/src/core/tsi/alts/crypt/gsec.h +3 -3
  695. data/src/core/tsi/alts/frame_protector/alts_counter.h +3 -3
  696. data/src/core/tsi/alts/frame_protector/alts_crypter.h +3 -3
  697. data/src/core/tsi/alts/frame_protector/alts_frame_protector.h +3 -3
  698. data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h +3 -3
  699. data/src/core/tsi/alts/frame_protector/frame_handler.h +3 -3
  700. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +3 -3
  701. data/src/core/tsi/alts/handshaker/alts_shared_resource.h +3 -3
  702. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +3 -3
  703. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +3 -3
  704. data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +3 -3
  705. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +3 -3
  706. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h +3 -3
  707. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h +3 -3
  708. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h +3 -3
  709. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +3 -3
  710. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h +3 -3
  711. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h +3 -3
  712. data/src/core/tsi/fake_transport_security.h +3 -3
  713. data/src/core/tsi/local_transport_security.h +3 -3
  714. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +1 -1
  715. data/src/core/tsi/ssl/key_logging/ssl_key_logging.h +3 -3
  716. data/src/core/tsi/ssl/session_cache/ssl_session.h +3 -3
  717. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +3 -3
  718. data/src/core/tsi/ssl_transport_security.cc +113 -24
  719. data/src/core/tsi/ssl_transport_security.h +5 -3
  720. data/src/core/tsi/ssl_transport_security_utils.h +3 -3
  721. data/src/core/tsi/ssl_types.h +3 -3
  722. data/src/core/tsi/transport_security.h +3 -3
  723. data/src/core/tsi/transport_security_grpc.h +3 -3
  724. data/src/core/tsi/transport_security_interface.h +3 -3
  725. data/src/ruby/lib/grpc/version.rb +1 -1
  726. data/src/ruby/pb/generate_proto_ruby.sh +0 -6
  727. data/third_party/abseil-cpp/absl/algorithm/container.h +56 -57
  728. data/third_party/abseil-cpp/absl/base/attributes.h +39 -19
  729. data/third_party/abseil-cpp/absl/base/config.h +44 -3
  730. data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +3 -18
  731. data/third_party/abseil-cpp/absl/base/internal/cycleclock_config.h +55 -0
  732. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +2 -1
  733. data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +3 -3
  734. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +2 -2
  735. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +1 -1
  736. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +10 -6
  737. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +23 -24
  738. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +3 -3
  739. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +2 -6
  740. data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +4 -1
  741. data/third_party/abseil-cpp/absl/base/internal/strerror.cc +4 -4
  742. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +14 -10
  743. data/third_party/abseil-cpp/absl/base/internal/thread_annotations.h +9 -0
  744. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +4 -0
  745. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +3 -40
  746. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h +62 -0
  747. data/third_party/abseil-cpp/absl/base/macros.h +4 -21
  748. data/third_party/abseil-cpp/absl/base/optimization.h +58 -6
  749. data/third_party/abseil-cpp/absl/base/options.h +1 -7
  750. data/third_party/abseil-cpp/absl/base/policy_checks.h +15 -13
  751. data/third_party/abseil-cpp/absl/container/fixed_array.h +7 -5
  752. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +0 -7
  753. data/third_party/abseil-cpp/absl/container/inlined_vector.h +66 -18
  754. data/third_party/abseil-cpp/absl/container/internal/common.h +3 -3
  755. data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +132 -0
  756. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +13 -1
  757. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +4 -55
  758. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +50 -5
  759. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +14 -46
  760. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +110 -32
  761. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +155 -4
  762. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +661 -341
  763. data/third_party/abseil-cpp/absl/crc/crc32c.cc +99 -0
  764. data/third_party/abseil-cpp/absl/crc/crc32c.h +183 -0
  765. data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.cc +256 -0
  766. data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.h +57 -0
  767. data/third_party/abseil-cpp/absl/crc/internal/crc.cc +468 -0
  768. data/third_party/abseil-cpp/absl/crc/internal/crc.h +91 -0
  769. data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +269 -0
  770. data/third_party/abseil-cpp/absl/crc/internal/crc32c.h +39 -0
  771. data/third_party/abseil-cpp/absl/crc/internal/crc32c_inline.h +72 -0
  772. data/third_party/abseil-cpp/absl/crc/internal/crc_cord_state.cc +130 -0
  773. data/third_party/abseil-cpp/absl/crc/internal/crc_cord_state.h +159 -0
  774. data/third_party/abseil-cpp/absl/crc/internal/crc_internal.h +179 -0
  775. data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy.h +119 -0
  776. data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy_fallback.cc +75 -0
  777. data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy_x86_64.cc +434 -0
  778. data/third_party/abseil-cpp/absl/crc/internal/crc_non_temporal_memcpy.cc +93 -0
  779. data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +725 -0
  780. data/third_party/abseil-cpp/absl/crc/internal/non_temporal_arm_intrinsics.h +79 -0
  781. data/third_party/abseil-cpp/absl/crc/internal/non_temporal_memcpy.h +180 -0
  782. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +1 -1
  783. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +67 -38
  784. data/third_party/abseil-cpp/absl/debugging/internal/demangle.h +1 -1
  785. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +12 -13
  786. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +11 -9
  787. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +1 -1
  788. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +40 -85
  789. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +5 -4
  790. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +33 -8
  791. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +3 -2
  792. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +3 -2
  793. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +118 -94
  794. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +7 -6
  795. data/third_party/abseil-cpp/absl/functional/any_invocable.h +5 -2
  796. data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +47 -26
  797. data/third_party/abseil-cpp/absl/hash/internal/city.cc +10 -10
  798. data/third_party/abseil-cpp/absl/hash/internal/hash.h +18 -4
  799. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +3 -14
  800. data/third_party/abseil-cpp/absl/memory/memory.h +26 -447
  801. data/third_party/abseil-cpp/absl/meta/type_traits.h +104 -12
  802. data/third_party/abseil-cpp/absl/numeric/bits.h +2 -3
  803. data/third_party/abseil-cpp/absl/numeric/int128.cc +10 -8
  804. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +14 -6
  805. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +2 -1
  806. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +1 -1
  807. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +2 -23
  808. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +9 -9
  809. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +2 -2
  810. data/third_party/abseil-cpp/absl/random/random.h +6 -6
  811. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +1 -0
  812. data/third_party/abseil-cpp/absl/status/status.cc +19 -12
  813. data/third_party/abseil-cpp/absl/status/status.h +2 -2
  814. data/third_party/abseil-cpp/absl/strings/ascii.cc +5 -5
  815. data/third_party/abseil-cpp/absl/strings/charconv.cc +534 -96
  816. data/third_party/abseil-cpp/absl/strings/cord.cc +92 -40
  817. data/third_party/abseil-cpp/absl/strings/cord.h +71 -80
  818. data/third_party/abseil-cpp/absl/strings/cord_buffer.h +8 -5
  819. data/third_party/abseil-cpp/absl/strings/escaping.cc +73 -62
  820. data/third_party/abseil-cpp/absl/strings/escaping.h +24 -19
  821. data/third_party/abseil-cpp/absl/strings/internal/char_map.h +14 -12
  822. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +4 -4
  823. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +2 -2
  824. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +326 -70
  825. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +8 -4
  826. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +26 -14
  827. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +5 -5
  828. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.cc +9 -7
  829. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.h +5 -4
  830. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h +7 -15
  831. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +3 -3
  832. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +8 -5
  833. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +7 -7
  834. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +4 -4
  835. data/third_party/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.cc +93 -0
  836. data/third_party/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.h +34 -0
  837. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +12 -10
  838. data/third_party/abseil-cpp/absl/strings/internal/escaping.h +7 -9
  839. data/third_party/abseil-cpp/absl/strings/internal/has_absl_stringify.h +55 -0
  840. data/third_party/abseil-cpp/absl/strings/internal/memutil.cc +9 -6
  841. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +14 -7
  842. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.h +35 -10
  843. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +113 -46
  844. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +126 -29
  845. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +3 -2
  846. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +4 -3
  847. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +49 -287
  848. data/third_party/abseil-cpp/absl/strings/internal/str_format/constexpr_parser.h +351 -0
  849. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +2 -1
  850. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +4 -2
  851. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +215 -181
  852. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +10 -209
  853. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +10 -101
  854. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +2 -1
  855. data/third_party/abseil-cpp/absl/strings/internal/stringify_sink.cc +28 -0
  856. data/third_party/abseil-cpp/absl/strings/internal/stringify_sink.h +57 -0
  857. data/third_party/abseil-cpp/absl/strings/numbers.cc +34 -31
  858. data/third_party/abseil-cpp/absl/strings/str_cat.cc +9 -6
  859. data/third_party/abseil-cpp/absl/strings/str_cat.h +50 -3
  860. data/third_party/abseil-cpp/absl/strings/str_format.h +71 -9
  861. data/third_party/abseil-cpp/absl/strings/string_view.cc +6 -6
  862. data/third_party/abseil-cpp/absl/strings/string_view.h +3 -10
  863. data/third_party/abseil-cpp/absl/strings/substitute.cc +8 -6
  864. data/third_party/abseil-cpp/absl/strings/substitute.h +46 -20
  865. data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +20 -17
  866. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +37 -31
  867. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +22 -8
  868. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +104 -55
  869. data/third_party/abseil-cpp/absl/synchronization/mutex.h +85 -46
  870. data/third_party/abseil-cpp/absl/synchronization/notification.cc +0 -1
  871. data/third_party/abseil-cpp/absl/synchronization/notification.h +0 -1
  872. data/third_party/abseil-cpp/absl/time/civil_time.cc +26 -0
  873. data/third_party/abseil-cpp/absl/time/civil_time.h +25 -0
  874. data/third_party/abseil-cpp/absl/time/clock.cc +17 -11
  875. data/third_party/abseil-cpp/absl/time/duration.cc +7 -7
  876. data/third_party/abseil-cpp/absl/time/format.cc +2 -1
  877. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +1 -1
  878. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +26 -5
  879. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +7 -6
  880. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +36 -35
  881. data/third_party/abseil-cpp/absl/time/time.cc +2 -2
  882. data/third_party/abseil-cpp/absl/time/time.h +253 -158
  883. data/third_party/abseil-cpp/absl/types/internal/span.h +30 -19
  884. data/third_party/abseil-cpp/absl/types/internal/variant.h +28 -40
  885. data/third_party/abseil-cpp/absl/types/span.h +29 -7
  886. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +1 -1
  887. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +1 -2
  888. metadata +73 -8
  889. data/src/core/lib/event_engine/socket_notifier.h +0 -55
  890. data/src/core/lib/promise/for_each.h +0 -155
  891. data/src/core/lib/promise/map_pipe.h +0 -88
  892. data/src/core/lib/promise/try_concurrently.h +0 -342
@@ -26,6 +26,7 @@
26
26
 
27
27
  #include <algorithm>
28
28
  #include <atomic>
29
+ #include <initializer_list>
29
30
  #include <memory>
30
31
  #include <new>
31
32
  #include <string>
@@ -83,7 +84,7 @@
83
84
  #include "src/core/lib/promise/activity.h"
84
85
  #include "src/core/lib/promise/arena_promise.h"
85
86
  #include "src/core/lib/promise/context.h"
86
- #include "src/core/lib/promise/latch.h"
87
+ #include "src/core/lib/promise/detail/basic_seq.h"
87
88
  #include "src/core/lib/promise/pipe.h"
88
89
  #include "src/core/lib/promise/poll.h"
89
90
  #include "src/core/lib/resource_quota/arena.h"
@@ -102,7 +103,7 @@
102
103
  grpc_core::TraceFlag grpc_call_error_trace(false, "call_error");
103
104
  grpc_core::TraceFlag grpc_compression_trace(false, "compression");
104
105
  grpc_core::TraceFlag grpc_call_trace(false, "call");
105
- grpc_core::TraceFlag grpc_call_refcount_trace(false, "call_refcount");
106
+ grpc_core::DebugOnlyTraceFlag grpc_call_refcount_trace(false, "call_refcount");
106
107
 
107
108
  namespace grpc_core {
108
109
 
@@ -347,7 +348,8 @@ void Call::DeleteThis() {
347
348
  RefCountedPtr<Channel> channel = std::move(channel_);
348
349
  Arena* arena = arena_;
349
350
  this->~Call();
350
- channel->UpdateCallSizeEstimate(arena->Destroy());
351
+ channel->UpdateCallSizeEstimate(arena->TotalUsedBytes());
352
+ arena->Destroy();
351
353
  }
352
354
 
353
355
  ///////////////////////////////////////////////////////////////////////////////
@@ -451,6 +453,31 @@ class FilterStackCall final : public Call {
451
453
  static constexpr gpr_atm kRecvNone = 0;
452
454
  static constexpr gpr_atm kRecvInitialMetadataFirst = 1;
453
455
 
456
+ enum class PendingOp {
457
+ kRecvMessage,
458
+ kRecvInitialMetadata,
459
+ kRecvTrailingMetadata,
460
+ kSends
461
+ };
462
+ static intptr_t PendingOpMask(PendingOp op) {
463
+ return static_cast<intptr_t>(1) << static_cast<intptr_t>(op);
464
+ }
465
+ static std::string PendingOpString(intptr_t pending_ops) {
466
+ std::vector<absl::string_view> pending_op_strings;
467
+ if (pending_ops & PendingOpMask(PendingOp::kRecvMessage)) {
468
+ pending_op_strings.push_back("kRecvMessage");
469
+ }
470
+ if (pending_ops & PendingOpMask(PendingOp::kRecvInitialMetadata)) {
471
+ pending_op_strings.push_back("kRecvInitialMetadata");
472
+ }
473
+ if (pending_ops & PendingOpMask(PendingOp::kRecvTrailingMetadata)) {
474
+ pending_op_strings.push_back("kRecvTrailingMetadata");
475
+ }
476
+ if (pending_ops & PendingOpMask(PendingOp::kSends)) {
477
+ pending_op_strings.push_back("kSends");
478
+ }
479
+ return absl::StrCat("{", absl::StrJoin(pending_op_strings, ","), "}");
480
+ }
454
481
  struct BatchControl {
455
482
  FilterStackCall* call_ = nullptr;
456
483
  grpc_transport_stream_op_batch op_;
@@ -475,17 +502,26 @@ class FilterStackCall final : public Call {
475
502
  } completion_data_;
476
503
  grpc_closure start_batch_;
477
504
  grpc_closure finish_batch_;
478
- std::atomic<intptr_t> steps_to_complete_{0};
505
+ std::atomic<intptr_t> ops_pending_{0};
479
506
  AtomicError batch_error_;
480
- void set_num_steps_to_complete(uintptr_t steps) {
481
- steps_to_complete_.store(steps, std::memory_order_release);
507
+ void set_pending_ops(uintptr_t ops) {
508
+ ops_pending_.store(ops, std::memory_order_release);
482
509
  }
483
- bool completed_batch_step() {
484
- return steps_to_complete_.fetch_sub(1, std::memory_order_acq_rel) == 1;
510
+ bool completed_batch_step(PendingOp op) {
511
+ auto mask = PendingOpMask(op);
512
+ auto r = ops_pending_.fetch_sub(mask, std::memory_order_acq_rel);
513
+ if (grpc_call_trace.enabled()) {
514
+ gpr_log(GPR_DEBUG, "BATCH:%p COMPLETE:%s REMAINING:%s (tag:%p)", this,
515
+ PendingOpString(mask).c_str(),
516
+ PendingOpString(r & ~mask).c_str(),
517
+ completion_data_.notify_tag.tag);
518
+ }
519
+ GPR_ASSERT((r & mask) != 0);
520
+ return r == mask;
485
521
  }
486
522
 
487
523
  void PostCompletion();
488
- void FinishStep();
524
+ void FinishStep(PendingOp op);
489
525
  void ProcessDataAfterMetadata();
490
526
  void ReceivingStreamReady(grpc_error_handle error);
491
527
  void ValidateFilteredMetadata();
@@ -1104,6 +1140,10 @@ FilterStackCall::BatchControl* FilterStackCall::ReuseOrAllocateBatchControl(
1104
1140
  void FilterStackCall::BatchControl::PostCompletion() {
1105
1141
  FilterStackCall* call = call_;
1106
1142
  grpc_error_handle error = batch_error_.get();
1143
+ if (grpc_call_trace.enabled()) {
1144
+ gpr_log(GPR_DEBUG, "tag:%p batch_error=%s", completion_data_.notify_tag.tag,
1145
+ error.ToString().c_str());
1146
+ }
1107
1147
 
1108
1148
  if (op_.send_initial_metadata) {
1109
1149
  call->send_initial_metadata_.Clear();
@@ -1133,14 +1173,12 @@ void FilterStackCall::BatchControl::PostCompletion() {
1133
1173
  batch_error_.set(absl::OkStatus());
1134
1174
 
1135
1175
  if (completion_data_.notify_tag.is_closure) {
1136
- // unrefs error
1137
1176
  call_ = nullptr;
1138
1177
  Closure::Run(DEBUG_LOCATION,
1139
1178
  static_cast<grpc_closure*>(completion_data_.notify_tag.tag),
1140
1179
  error);
1141
1180
  call->InternalUnref("completion");
1142
1181
  } else {
1143
- // unrefs error
1144
1182
  grpc_cq_end_op(
1145
1183
  call->cq_, completion_data_.notify_tag.tag, error,
1146
1184
  [](void* user_data, grpc_cq_completion* /*storage*/) {
@@ -1153,8 +1191,8 @@ void FilterStackCall::BatchControl::PostCompletion() {
1153
1191
  }
1154
1192
  }
1155
1193
 
1156
- void FilterStackCall::BatchControl::FinishStep() {
1157
- if (GPR_UNLIKELY(completed_batch_step())) {
1194
+ void FilterStackCall::BatchControl::FinishStep(PendingOp op) {
1195
+ if (GPR_UNLIKELY(completed_batch_step(op))) {
1158
1196
  PostCompletion();
1159
1197
  }
1160
1198
  }
@@ -1164,7 +1202,7 @@ void FilterStackCall::BatchControl::ProcessDataAfterMetadata() {
1164
1202
  if (!call->receiving_slice_buffer_.has_value()) {
1165
1203
  *call->receiving_buffer_ = nullptr;
1166
1204
  call->receiving_message_ = false;
1167
- FinishStep();
1205
+ FinishStep(PendingOp::kRecvMessage);
1168
1206
  } else {
1169
1207
  call->test_only_last_message_flags_ = call->receiving_stream_flags_;
1170
1208
  if ((call->receiving_stream_flags_ & GRPC_WRITE_INTERNAL_COMPRESS) &&
@@ -1179,12 +1217,20 @@ void FilterStackCall::BatchControl::ProcessDataAfterMetadata() {
1179
1217
  &(*call->receiving_buffer_)->data.raw.slice_buffer);
1180
1218
  call->receiving_message_ = false;
1181
1219
  call->receiving_slice_buffer_.reset();
1182
- FinishStep();
1220
+ FinishStep(PendingOp::kRecvMessage);
1183
1221
  }
1184
1222
  }
1185
1223
 
1186
1224
  void FilterStackCall::BatchControl::ReceivingStreamReady(
1187
1225
  grpc_error_handle error) {
1226
+ if (grpc_call_trace.enabled()) {
1227
+ gpr_log(GPR_DEBUG,
1228
+ "tag:%p ReceivingStreamReady error=%s "
1229
+ "receiving_slice_buffer.has_value=%d recv_state=%" PRIdPTR,
1230
+ completion_data_.notify_tag.tag, error.ToString().c_str(),
1231
+ call_->receiving_slice_buffer_.has_value(),
1232
+ gpr_atm_no_barrier_load(&call_->recv_state_));
1233
+ }
1188
1234
  FilterStackCall* call = call_;
1189
1235
  if (!error.ok()) {
1190
1236
  call->receiving_slice_buffer_.reset();
@@ -1302,7 +1348,7 @@ void FilterStackCall::BatchControl::ReceivingInitialMetadataReady(
1302
1348
  Closure::Run(DEBUG_LOCATION, saved_rsr_closure, error);
1303
1349
  }
1304
1350
 
1305
- FinishStep();
1351
+ FinishStep(PendingOp::kRecvInitialMetadata);
1306
1352
  }
1307
1353
 
1308
1354
  void FilterStackCall::BatchControl::ReceivingTrailingMetadataReady(
@@ -1311,7 +1357,7 @@ void FilterStackCall::BatchControl::ReceivingTrailingMetadataReady(
1311
1357
  "recv_trailing_metadata_ready");
1312
1358
  grpc_metadata_batch* md = &call_->recv_trailing_metadata_;
1313
1359
  call_->RecvTrailingFilter(md, error);
1314
- FinishStep();
1360
+ FinishStep(PendingOp::kRecvTrailingMetadata);
1315
1361
  }
1316
1362
 
1317
1363
  void FilterStackCall::BatchControl::FinishBatch(grpc_error_handle error) {
@@ -1322,7 +1368,7 @@ void FilterStackCall::BatchControl::FinishBatch(grpc_error_handle error) {
1322
1368
  if (!error.ok()) {
1323
1369
  call_->CancelWithError(error);
1324
1370
  }
1325
- FinishStep();
1371
+ FinishStep(PendingOp::kSends);
1326
1372
  }
1327
1373
 
1328
1374
  namespace {
@@ -1349,12 +1395,11 @@ grpc_call_error FilterStackCall::StartBatch(const grpc_op* ops, size_t nops,
1349
1395
  size_t i;
1350
1396
  const grpc_op* op;
1351
1397
  BatchControl* bctl;
1352
- bool has_send_ops = false;
1353
- int num_recv_ops = 0;
1354
1398
  grpc_call_error error = GRPC_CALL_OK;
1355
1399
  grpc_transport_stream_op_batch* stream_op;
1356
1400
  grpc_transport_stream_op_batch_payload* stream_op_payload;
1357
1401
  uint32_t seen_ops = 0;
1402
+ intptr_t pending_ops = 0;
1358
1403
 
1359
1404
  for (i = 0; i < nops; i++) {
1360
1405
  if (seen_ops & (1u << ops[i].op)) {
@@ -1471,7 +1516,7 @@ grpc_call_error FilterStackCall::StartBatch(const grpc_op* ops, size_t nops,
1471
1516
  stream_op_payload->send_initial_metadata.peer_string =
1472
1517
  peer_string_atm_ptr();
1473
1518
  }
1474
- has_send_ops = true;
1519
+ pending_ops |= PendingOpMask(PendingOp::kSends);
1475
1520
  break;
1476
1521
  }
1477
1522
  case GRPC_OP_SEND_MESSAGE: {
@@ -1503,7 +1548,7 @@ grpc_call_error FilterStackCall::StartBatch(const grpc_op* ops, size_t nops,
1503
1548
  send_slice_buffer_.c_slice_buffer());
1504
1549
  stream_op_payload->send_message.flags = flags;
1505
1550
  stream_op_payload->send_message.send_message = &send_slice_buffer_;
1506
- has_send_ops = true;
1551
+ pending_ops |= PendingOpMask(PendingOp::kSends);
1507
1552
  break;
1508
1553
  }
1509
1554
  case GRPC_OP_SEND_CLOSE_FROM_CLIENT: {
@@ -1524,7 +1569,7 @@ grpc_call_error FilterStackCall::StartBatch(const grpc_op* ops, size_t nops,
1524
1569
  sent_final_op_ = true;
1525
1570
  stream_op_payload->send_trailing_metadata.send_trailing_metadata =
1526
1571
  &send_trailing_metadata_;
1527
- has_send_ops = true;
1572
+ pending_ops |= PendingOpMask(PendingOp::kSends);
1528
1573
  break;
1529
1574
  }
1530
1575
  case GRPC_OP_SEND_STATUS_FROM_SERVER: {
@@ -1588,7 +1633,7 @@ grpc_call_error FilterStackCall::StartBatch(const grpc_op* ops, size_t nops,
1588
1633
  &send_trailing_metadata_;
1589
1634
  stream_op_payload->send_trailing_metadata.sent =
1590
1635
  &sent_server_trailing_metadata_;
1591
- has_send_ops = true;
1636
+ pending_ops |= PendingOpMask(PendingOp::kSends);
1592
1637
  break;
1593
1638
  }
1594
1639
  case GRPC_OP_RECV_INITIAL_METADATA: {
@@ -1623,7 +1668,7 @@ grpc_call_error FilterStackCall::StartBatch(const grpc_op* ops, size_t nops,
1623
1668
  stream_op_payload->recv_initial_metadata.peer_string =
1624
1669
  peer_string_atm_ptr();
1625
1670
  }
1626
- ++num_recv_ops;
1671
+ pending_ops |= PendingOpMask(PendingOp::kRecvInitialMetadata);
1627
1672
  break;
1628
1673
  }
1629
1674
  case GRPC_OP_RECV_MESSAGE: {
@@ -1659,7 +1704,7 @@ grpc_call_error FilterStackCall::StartBatch(const grpc_op* ops, size_t nops,
1659
1704
  bctl, grpc_schedule_on_exec_ctx);
1660
1705
  stream_op_payload->recv_message.recv_message_ready =
1661
1706
  &receiving_stream_ready_;
1662
- ++num_recv_ops;
1707
+ pending_ops |= PendingOpMask(PendingOp::kRecvMessage);
1663
1708
  break;
1664
1709
  }
1665
1710
  case GRPC_OP_RECV_STATUS_ON_CLIENT: {
@@ -1698,7 +1743,7 @@ grpc_call_error FilterStackCall::StartBatch(const grpc_op* ops, size_t nops,
1698
1743
  bctl, grpc_schedule_on_exec_ctx);
1699
1744
  stream_op_payload->recv_trailing_metadata.recv_trailing_metadata_ready =
1700
1745
  &receiving_trailing_metadata_ready_;
1701
- ++num_recv_ops;
1746
+ pending_ops |= PendingOpMask(PendingOp::kRecvTrailingMetadata);
1702
1747
  break;
1703
1748
  }
1704
1749
  case GRPC_OP_RECV_CLOSE_ON_SERVER: {
@@ -1731,7 +1776,7 @@ grpc_call_error FilterStackCall::StartBatch(const grpc_op* ops, size_t nops,
1731
1776
  bctl, grpc_schedule_on_exec_ctx);
1732
1777
  stream_op_payload->recv_trailing_metadata.recv_trailing_metadata_ready =
1733
1778
  &receiving_trailing_metadata_ready_;
1734
- ++num_recv_ops;
1779
+ pending_ops |= PendingOpMask(PendingOp::kRecvTrailingMetadata);
1735
1780
  break;
1736
1781
  }
1737
1782
  }
@@ -1741,9 +1786,9 @@ grpc_call_error FilterStackCall::StartBatch(const grpc_op* ops, size_t nops,
1741
1786
  if (!is_notify_tag_closure) {
1742
1787
  GPR_ASSERT(grpc_cq_begin_op(cq_, notify_tag));
1743
1788
  }
1744
- bctl->set_num_steps_to_complete((has_send_ops ? 1 : 0) + num_recv_ops);
1789
+ bctl->set_pending_ops(pending_ops);
1745
1790
 
1746
- if (has_send_ops) {
1791
+ if (pending_ops & PendingOpMask(PendingOp::kSends)) {
1747
1792
  GRPC_CLOSURE_INIT(
1748
1793
  &bctl->finish_batch_,
1749
1794
  [](void* bctl, grpc_error_handle error) {
@@ -1753,6 +1798,13 @@ grpc_call_error FilterStackCall::StartBatch(const grpc_op* ops, size_t nops,
1753
1798
  stream_op->on_complete = &bctl->finish_batch_;
1754
1799
  }
1755
1800
 
1801
+ if (grpc_call_trace.enabled()) {
1802
+ gpr_log(GPR_DEBUG, "BATCH:%p START:%s BATCH:%s (tag:%p)", bctl,
1803
+ PendingOpString(pending_ops).c_str(),
1804
+ grpc_transport_stream_op_batch_string(stream_op).c_str(),
1805
+ bctl->completion_data_.notify_tag.tag);
1806
+ }
1807
+
1756
1808
  ExecuteBatch(stream_op, &bctl->start_batch_);
1757
1809
 
1758
1810
  done:
@@ -1826,21 +1878,52 @@ class PromiseBasedCall : public Call,
1826
1878
  public grpc_event_engine::experimental::EventEngine::
1827
1879
  Closure /* for deadlines */ {
1828
1880
  public:
1829
- PromiseBasedCall(Arena* arena, const grpc_call_create_args& args);
1881
+ PromiseBasedCall(Arena* arena, uint32_t initial_external_refs,
1882
+ const grpc_call_create_args& args);
1830
1883
 
1831
1884
  void ContextSet(grpc_context_index elem, void* value,
1832
1885
  void (*destroy)(void* value)) override;
1833
1886
  void* ContextGet(grpc_context_index elem) const override;
1834
1887
  void SetCompletionQueue(grpc_completion_queue* cq) override;
1888
+ void SetCompletionQueueLocked(grpc_completion_queue* cq)
1889
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
1890
+ void CancelWithError(absl::Status error) final ABSL_LOCKS_EXCLUDED(mu_) {
1891
+ MutexLock lock(&mu_);
1892
+ CancelWithErrorLocked(std::move(error));
1893
+ }
1894
+ virtual void CancelWithErrorLocked(absl::Status error)
1895
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) = 0;
1896
+ bool Completed() final ABSL_LOCKS_EXCLUDED(mu_) {
1897
+ MutexLock lock(&mu_);
1898
+ return completed_;
1899
+ }
1900
+
1901
+ void Orphan() final {
1902
+ MutexLock lock(&mu_);
1903
+ if (!completed_) {
1904
+ CancelWithErrorLocked(absl::CancelledError("Call orphaned"));
1905
+ }
1906
+ }
1835
1907
 
1836
1908
  // Implementation of call refcounting: move this to DualRefCounted once we
1837
1909
  // don't need to maintain FilterStackCall compatibility
1838
1910
  void ExternalRef() final {
1839
- refs_.fetch_add(MakeRefPair(1, 0), std::memory_order_relaxed);
1911
+ const uint64_t prev_ref_pair =
1912
+ refs_.fetch_add(MakeRefPair(1, 0), std::memory_order_relaxed);
1913
+ if (grpc_call_refcount_trace.enabled()) {
1914
+ gpr_log(GPR_DEBUG, "%s EXTERNAL_REF: %d:%d->%d:%d", DebugTag().c_str(),
1915
+ GetStrongRefs(prev_ref_pair), GetWeakRefs(prev_ref_pair),
1916
+ GetStrongRefs(prev_ref_pair) + 1, GetWeakRefs(prev_ref_pair));
1917
+ }
1840
1918
  }
1841
1919
  void ExternalUnref() final {
1842
1920
  const uint64_t prev_ref_pair =
1843
1921
  refs_.fetch_add(MakeRefPair(-1, 1), std::memory_order_acq_rel);
1922
+ if (grpc_call_refcount_trace.enabled()) {
1923
+ gpr_log(GPR_DEBUG, "%s EXTERNAL_UNREF: %d:%d->%d:%d", DebugTag().c_str(),
1924
+ GetStrongRefs(prev_ref_pair), GetWeakRefs(prev_ref_pair),
1925
+ GetStrongRefs(prev_ref_pair) - 1, GetWeakRefs(prev_ref_pair) + 1);
1926
+ }
1844
1927
  const uint32_t strong_refs = GetStrongRefs(prev_ref_pair);
1845
1928
  if (GPR_UNLIKELY(strong_refs == 1)) {
1846
1929
  Orphan();
@@ -1848,12 +1931,22 @@ class PromiseBasedCall : public Call,
1848
1931
  // Now drop the weak ref.
1849
1932
  InternalUnref("external_ref");
1850
1933
  }
1851
- void InternalRef(const char*) final {
1852
- refs_.fetch_add(MakeRefPair(0, 1), std::memory_order_relaxed);
1934
+ void InternalRef(const char* reason) final {
1935
+ uint64_t n = refs_.fetch_add(MakeRefPair(0, 1), std::memory_order_relaxed);
1936
+ if (grpc_call_refcount_trace.enabled()) {
1937
+ gpr_log(GPR_DEBUG, "%s REF: %s %d:%d->%d:%d", DebugTag().c_str(), reason,
1938
+ GetStrongRefs(n), GetWeakRefs(n), GetStrongRefs(n),
1939
+ GetWeakRefs(n) + 1);
1940
+ }
1853
1941
  }
1854
- void InternalUnref(const char*) final {
1942
+ void InternalUnref(const char* reason) final {
1855
1943
  const uint64_t prev_ref_pair =
1856
1944
  refs_.fetch_sub(MakeRefPair(0, 1), std::memory_order_acq_rel);
1945
+ if (grpc_call_refcount_trace.enabled()) {
1946
+ gpr_log(GPR_DEBUG, "%s UNREF: %s %d:%d->%d:%d", DebugTag().c_str(),
1947
+ reason, GetStrongRefs(prev_ref_pair), GetWeakRefs(prev_ref_pair),
1948
+ GetStrongRefs(prev_ref_pair), GetWeakRefs(prev_ref_pair) - 1);
1949
+ }
1857
1950
  if (GPR_UNLIKELY(prev_ref_pair == MakeRefPair(0, 1))) {
1858
1951
  DeleteThis();
1859
1952
  }
@@ -1877,34 +1970,34 @@ class PromiseBasedCall : public Call,
1877
1970
  public:
1878
1971
  explicit AsanWaker(PromiseBasedCall* call) : call_(call) {}
1879
1972
 
1880
- void Wakeup() override {
1881
- call_->Wakeup();
1973
+ void Wakeup(void*) override {
1974
+ call_->Wakeup(nullptr);
1882
1975
  delete this;
1883
1976
  }
1884
1977
 
1885
- void Drop() override {
1886
- call_->Drop();
1978
+ void Drop(void*) override {
1979
+ call_->Drop(nullptr);
1887
1980
  delete this;
1888
1981
  }
1889
1982
 
1890
- std::string ActivityDebugTag() const override {
1983
+ std::string ActivityDebugTag(void*) const override {
1891
1984
  return call_->DebugTag();
1892
1985
  }
1893
1986
 
1894
1987
  private:
1895
1988
  PromiseBasedCall* call_;
1896
1989
  };
1897
- return Waker(new AsanWaker(this));
1990
+ return Waker(new AsanWaker(this), nullptr);
1898
1991
  #endif
1899
1992
  #endif
1900
1993
  #ifndef GRPC_CALL_USES_ASAN_WAKER
1901
- return Waker(this);
1994
+ return Waker(this, nullptr);
1902
1995
  #endif
1903
1996
  }
1904
1997
  Waker MakeNonOwningWaker() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) override;
1905
1998
 
1906
1999
  // Wakeable methods
1907
- void Wakeup() override {
2000
+ void Wakeup(void*) override {
1908
2001
  channel()->event_engine()->Run([this] {
1909
2002
  ApplicationCallbackExecCtx app_exec_ctx;
1910
2003
  ExecCtx exec_ctx;
@@ -1916,7 +2009,7 @@ class PromiseBasedCall : public Call,
1916
2009
  InternalUnref("wakeup");
1917
2010
  });
1918
2011
  }
1919
- void Drop() override { InternalUnref("wakeup"); }
2012
+ void Drop(void*) override { InternalUnref("wakeup"); }
1920
2013
 
1921
2014
  void RunInContext(absl::AnyInvocable<void()> fn) {
1922
2015
  if (Activity::current() == this) {
@@ -1953,9 +2046,12 @@ class PromiseBasedCall : public Call,
1953
2046
 
1954
2047
  void UpdateDeadline(Timestamp deadline);
1955
2048
  void ResetDeadline();
2049
+
1956
2050
  // Implementation of EventEngine::Closure, called when deadline expires
1957
2051
  void Run() override;
1958
2052
 
2053
+ virtual ServerCallContext* server_call_context() { return nullptr; }
2054
+
1959
2055
  protected:
1960
2056
  class ScopedContext
1961
2057
  : public ScopedActivity,
@@ -1993,11 +2089,6 @@ class PromiseBasedCall : public Call,
1993
2089
  uint8_t TakeIndex() { return std::exchange(index_, kNullIndex); }
1994
2090
  bool has_value() const { return index_ != kNullIndex; }
1995
2091
 
1996
- std::string ToString() const {
1997
- return index_ == kNullIndex ? "null"
1998
- : std::to_string(static_cast<int>(index_));
1999
- }
2000
-
2001
2092
  private:
2002
2093
  enum : uint8_t { kNullIndex = 0xff };
2003
2094
  uint8_t index_;
@@ -2015,22 +2106,27 @@ class PromiseBasedCall : public Call,
2015
2106
  // The following correspond with the batch operations from above
2016
2107
  kReceiveInitialMetadata,
2017
2108
  kReceiveStatusOnClient,
2109
+ kReceiveCloseOnServer = kReceiveStatusOnClient,
2018
2110
  kSendMessage,
2019
2111
  kReceiveMessage,
2112
+ kSendStatusFromServer,
2113
+ kSendCloseFromClient = kSendStatusFromServer,
2020
2114
  };
2021
2115
 
2022
- static constexpr const char* PendingOpString(PendingOp reason) {
2116
+ const char* PendingOpString(PendingOp reason) const {
2023
2117
  switch (reason) {
2024
2118
  case PendingOp::kStartingBatch:
2025
2119
  return "StartingBatch";
2026
2120
  case PendingOp::kReceiveInitialMetadata:
2027
2121
  return "ReceiveInitialMetadata";
2028
2122
  case PendingOp::kReceiveStatusOnClient:
2029
- return "ReceiveStatusOnClient";
2123
+ return is_client() ? "ReceiveStatusOnClient" : "ReceiveCloseOnServer";
2030
2124
  case PendingOp::kSendMessage:
2031
2125
  return "SendMessage";
2032
2126
  case PendingOp::kReceiveMessage:
2033
2127
  return "ReceiveMessage";
2128
+ case PendingOp::kSendStatusFromServer:
2129
+ return is_client() ? "SendCloseFromClient" : "SendStatusFromServer";
2034
2130
  }
2035
2131
  return "Unknown";
2036
2132
  }
@@ -2040,7 +2136,6 @@ class PromiseBasedCall : public Call,
2040
2136
  }
2041
2137
 
2042
2138
  Mutex* mu() const ABSL_LOCK_RETURNED(mu_) { return &mu_; }
2043
-
2044
2139
  // Begin work on a completion, recording the tag/closure to notify.
2045
2140
  // Use the op selected in \a ops to determine the index to allocate into.
2046
2141
  // Starts the "StartingBatch" PendingOp immediately.
@@ -2050,12 +2145,21 @@ class PromiseBasedCall : public Call,
2050
2145
  // Add one pending op to the completion, and return it.
2051
2146
  Completion AddOpToCompletion(const Completion& completion, PendingOp reason)
2052
2147
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
2148
+ // Stringify a completion
2149
+ std::string CompletionString(const Completion& completion) const {
2150
+ return completion.has_value()
2151
+ ? absl::StrFormat(
2152
+ "%d:tag=%p", static_cast<int>(completion.index()),
2153
+ completion_info_[completion.index()].pending.tag)
2154
+ : "no-completion";
2155
+ }
2053
2156
  // Finish one op on the completion. Must have been previously been added.
2054
2157
  // The completion as a whole finishes when all pending ops finish.
2055
2158
  void FinishOpOnCompletion(Completion* completion, PendingOp reason)
2056
2159
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
2057
2160
  // Mark the completion as failed. Does not finish it.
2058
- void FailCompletion(const Completion& completion);
2161
+ void FailCompletion(const Completion& completion,
2162
+ SourceLocation source_location = {});
2059
2163
  // Run the promise polling loop until it stalls.
2060
2164
  void Update() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
2061
2165
  // Update the promise state once.
@@ -2075,7 +2179,7 @@ class PromiseBasedCall : public Call,
2075
2179
  void CToMetadata(grpc_metadata* metadata, size_t count,
2076
2180
  grpc_metadata_batch* batch);
2077
2181
 
2078
- std::string ActivityDebugTag() const override { return DebugTag(); }
2182
+ std::string ActivityDebugTag(void*) const override { return DebugTag(); }
2079
2183
 
2080
2184
  // At the end of the call run any finalization actions.
2081
2185
  void RunFinalization(grpc_status_code status, const char* status_details) {
@@ -2086,6 +2190,56 @@ class PromiseBasedCall : public Call,
2086
2190
  finalization_.Run(&final_info);
2087
2191
  }
2088
2192
 
2193
+ std::string PresentAndCompletionText(const char* caption, bool has,
2194
+ const Completion& completion) const {
2195
+ if (has) {
2196
+ if (completion.has_value()) {
2197
+ return absl::StrCat(caption, ":", CompletionString(completion), " ");
2198
+ } else {
2199
+ return absl::StrCat(caption,
2200
+ ":!!BUG:operation is present, no completion!! ");
2201
+ }
2202
+ } else {
2203
+ if (!completion.has_value()) {
2204
+ return "";
2205
+ } else {
2206
+ return absl::StrCat(caption, ":no-op:", CompletionString(completion),
2207
+ " ");
2208
+ }
2209
+ }
2210
+ }
2211
+
2212
+ std::string PollStateDebugString() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
2213
+ return absl::StrCat(PresentAndCompletionText("outstanding_send",
2214
+ outstanding_send_.has_value(),
2215
+ send_message_completion_)
2216
+ .c_str(),
2217
+ PresentAndCompletionText("outstanding_recv",
2218
+ outstanding_recv_.has_value(),
2219
+ recv_message_completion_)
2220
+ .c_str());
2221
+ }
2222
+
2223
+ void StartRecvMessage(const grpc_op& op, const Completion& completion,
2224
+ PipeReceiver<MessageHandle>* receiver)
2225
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
2226
+ void PollRecvMessage(grpc_compression_algorithm compression_algorithm)
2227
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
2228
+ void CancelRecvMessage() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
2229
+ void StartSendMessage(const grpc_op& op, const Completion& completion,
2230
+ PipeSender<MessageHandle>* sender)
2231
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
2232
+ bool PollSendMessage() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
2233
+ void CancelSendMessage() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
2234
+
2235
+ bool completed() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
2236
+ return completed_;
2237
+ }
2238
+ void set_completed() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) { completed_ = true; }
2239
+ bool is_sending() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
2240
+ return outstanding_send_.has_value();
2241
+ }
2242
+
2089
2243
  private:
2090
2244
  union CompletionInfo {
2091
2245
  struct Pending {
@@ -2116,7 +2270,7 @@ class PromiseBasedCall : public Call,
2116
2270
 
2117
2271
  // Activity needs to wake up (if it still exists!) - wake it up, and drop
2118
2272
  // the ref that was kept for this handle.
2119
- void Wakeup() override ABSL_LOCKS_EXCLUDED(mu_) {
2273
+ void Wakeup(void*) override ABSL_LOCKS_EXCLUDED(mu_) {
2120
2274
  // Drop the ref to the handle at end of scope (we have one ref = one
2121
2275
  // wakeup semantics).
2122
2276
  auto unref = absl::MakeCleanup([this]() { Unref(); });
@@ -2124,21 +2278,21 @@ class PromiseBasedCall : public Call,
2124
2278
  // Note that activity refcount can drop to zero, but we could win the lock
2125
2279
  // against DropActivity, so we need to only increase activities refcount
2126
2280
  // if it is non-zero.
2127
- if (call_ != nullptr && call_->RefIfNonZero()) {
2128
- PromiseBasedCall* call = call_;
2281
+ PromiseBasedCall* call = call_;
2282
+ if (call != nullptr && call->RefIfNonZero()) {
2129
2283
  lock.Release();
2130
2284
  // Activity still exists and we have a reference: wake it up, which will
2131
2285
  // drop the ref.
2132
- call->Wakeup();
2286
+ call->Wakeup(nullptr);
2133
2287
  }
2134
2288
  }
2135
2289
 
2136
- std::string ActivityDebugTag() const override {
2290
+ std::string ActivityDebugTag(void*) const override {
2137
2291
  MutexLock lock(&mu_);
2138
2292
  return call_ == nullptr ? "<unknown>" : call_->DebugTag();
2139
2293
  }
2140
2294
 
2141
- void Drop() override { Unref(); }
2295
+ void Drop(void*) override { Unref(); }
2142
2296
 
2143
2297
  private:
2144
2298
  // Unref the Handle (not the activity).
@@ -2185,7 +2339,7 @@ class PromiseBasedCall : public Call,
2185
2339
  }
2186
2340
 
2187
2341
  mutable Mutex mu_;
2188
- std::atomic<uint64_t> refs_{MakeRefPair(1, 0)};
2342
+ std::atomic<uint64_t> refs_;
2189
2343
  CallContext call_context_{this};
2190
2344
  bool keep_polling_ ABSL_GUARDED_BY(mu()) = false;
2191
2345
 
@@ -2199,6 +2353,14 @@ class PromiseBasedCall : public Call,
2199
2353
  // Current deadline.
2200
2354
  Timestamp deadline_ = Timestamp::InfFuture();
2201
2355
  grpc_event_engine::experimental::EventEngine::TaskHandle deadline_task_;
2356
+ absl::optional<PipeSender<MessageHandle>::PushType> outstanding_send_
2357
+ ABSL_GUARDED_BY(mu_);
2358
+ absl::optional<PipeReceiverNextType<MessageHandle>> outstanding_recv_
2359
+ ABSL_GUARDED_BY(mu_);
2360
+ grpc_byte_buffer** recv_message_ ABSL_GUARDED_BY(mu_) = nullptr;
2361
+ Completion send_message_completion_ ABSL_GUARDED_BY(mu_);
2362
+ Completion recv_message_completion_ ABSL_GUARDED_BY(mu_);
2363
+ bool completed_ ABSL_GUARDED_BY(mu_) = false;
2202
2364
  };
2203
2365
 
2204
2366
  template <typename T>
@@ -2214,10 +2376,11 @@ grpc_error_handle MakePromiseBasedCall(grpc_call_create_args* args,
2214
2376
  return absl::OkStatus();
2215
2377
  }
2216
2378
 
2217
- PromiseBasedCall::PromiseBasedCall(Arena* arena,
2379
+ PromiseBasedCall::PromiseBasedCall(Arena* arena, uint32_t initial_external_refs,
2218
2380
  const grpc_call_create_args& args)
2219
2381
  : Call(arena, args.server_transport_data == nullptr, args.send_deadline,
2220
2382
  args.channel->Ref()),
2383
+ refs_(MakeRefPair(initial_external_refs, 0)),
2221
2384
  cq_(args.cq) {
2222
2385
  if (args.cq != nullptr) {
2223
2386
  GPR_ASSERT(args.pollset_set_alternative == nullptr &&
@@ -2239,7 +2402,7 @@ Waker PromiseBasedCall::MakeNonOwningWaker() {
2239
2402
  } else {
2240
2403
  non_owning_wakeable_->Ref();
2241
2404
  }
2242
- return Waker(non_owning_wakeable_);
2405
+ return Waker(non_owning_wakeable_, nullptr);
2243
2406
  }
2244
2407
 
2245
2408
  void PromiseBasedCall::CToMetadata(grpc_metadata* metadata, size_t count,
@@ -2277,8 +2440,8 @@ PromiseBasedCall::Completion PromiseBasedCall::StartCompletion(
2277
2440
  void* tag, bool is_closure, const grpc_op* ops) {
2278
2441
  Completion c(BatchSlotForOp(ops[0].op));
2279
2442
  if (grpc_call_trace.enabled()) {
2280
- gpr_log(GPR_INFO, "%sStartCompletion %s tag=%p", DebugTag().c_str(),
2281
- c.ToString().c_str(), tag);
2443
+ gpr_log(GPR_INFO, "%s[call] StartCompletion %s tag=%p", DebugTag().c_str(),
2444
+ CompletionString(c).c_str(), tag);
2282
2445
  }
2283
2446
  if (!is_closure) {
2284
2447
  grpc_cq_begin_op(cq(), tag);
@@ -2291,9 +2454,10 @@ PromiseBasedCall::Completion PromiseBasedCall::StartCompletion(
2291
2454
  PromiseBasedCall::Completion PromiseBasedCall::AddOpToCompletion(
2292
2455
  const Completion& completion, PendingOp reason) {
2293
2456
  if (grpc_call_trace.enabled()) {
2294
- gpr_log(GPR_INFO, "%sAddOpToCompletion %s %s", DebugTag().c_str(),
2295
- completion.ToString().c_str(), PendingOpString(reason));
2457
+ gpr_log(GPR_INFO, "%s[call] AddOpToCompletion %s %s", DebugTag().c_str(),
2458
+ CompletionString(completion).c_str(), PendingOpString(reason));
2296
2459
  }
2460
+ GPR_ASSERT(completion.has_value());
2297
2461
  auto& pending_op_bits =
2298
2462
  completion_info_[completion.index()].pending.pending_op_bits;
2299
2463
  GPR_ASSERT((pending_op_bits & PendingOpBit(reason)) == 0);
@@ -2301,10 +2465,12 @@ PromiseBasedCall::Completion PromiseBasedCall::AddOpToCompletion(
2301
2465
  return Completion(completion.index());
2302
2466
  }
2303
2467
 
2304
- void PromiseBasedCall::FailCompletion(const Completion& completion) {
2468
+ void PromiseBasedCall::FailCompletion(const Completion& completion,
2469
+ SourceLocation location) {
2305
2470
  if (grpc_call_trace.enabled()) {
2306
- gpr_log(GPR_INFO, "%sFailCompletion %s", DebugTag().c_str(),
2307
- completion.ToString().c_str());
2471
+ gpr_log(location.file(), location.line(), GPR_LOG_SEVERITY_ERROR,
2472
+ "%s[call] FailCompletion %s", DebugTag().c_str(),
2473
+ CompletionString(completion).c_str());
2308
2474
  }
2309
2475
  completion_info_[completion.index()].pending.success = false;
2310
2476
  }
@@ -2323,8 +2489,9 @@ void PromiseBasedCall::FinishOpOnCompletion(Completion* completion,
2323
2489
  }
2324
2490
  }
2325
2491
  gpr_log(
2326
- GPR_INFO, "%sFinishOpOnCompletion %s %s %s", DebugTag().c_str(),
2327
- completion->ToString().c_str(), PendingOpString(reason),
2492
+ GPR_INFO, "%s[call] FinishOpOnCompletion tag:%p %s %s %s",
2493
+ DebugTag().c_str(), completion_info_[completion->index()].pending.tag,
2494
+ CompletionString(*completion).c_str(), PendingOpString(reason),
2328
2495
  (pending.empty()
2329
2496
  ? (success ? std::string("done") : std::string("failed"))
2330
2497
  : absl::StrFormat("pending_ops={%s}", absl::StrJoin(pending, ",")))
@@ -2359,6 +2526,10 @@ void PromiseBasedCall::ForceImmediateRepoll() { keep_polling_ = true; }
2359
2526
 
2360
2527
  void PromiseBasedCall::SetCompletionQueue(grpc_completion_queue* cq) {
2361
2528
  MutexLock lock(&mu_);
2529
+ SetCompletionQueueLocked(cq);
2530
+ }
2531
+
2532
+ void PromiseBasedCall::SetCompletionQueueLocked(grpc_completion_queue* cq) {
2362
2533
  cq_ = cq;
2363
2534
  GRPC_CQ_INTERNAL_REF(cq, "bind");
2364
2535
  call_context_.pollent_ =
@@ -2391,6 +2562,121 @@ void PromiseBasedCall::Run() {
2391
2562
  InternalUnref("deadline");
2392
2563
  }
2393
2564
 
2565
+ void PromiseBasedCall::StartSendMessage(const grpc_op& op,
2566
+ const Completion& completion,
2567
+ PipeSender<MessageHandle>* sender) {
2568
+ GPR_ASSERT(!outstanding_send_.has_value());
2569
+ if (!completed_) {
2570
+ send_message_completion_ =
2571
+ AddOpToCompletion(completion, PendingOp::kSendMessage);
2572
+ SliceBuffer send;
2573
+ grpc_slice_buffer_swap(
2574
+ &op.data.send_message.send_message->data.raw.slice_buffer,
2575
+ send.c_slice_buffer());
2576
+ outstanding_send_.emplace(sender->Push(
2577
+ GetContext<Arena>()->MakePooled<Message>(std::move(send), op.flags)));
2578
+ } else {
2579
+ FailCompletion(completion);
2580
+ }
2581
+ }
2582
+
2583
+ bool PromiseBasedCall::PollSendMessage() {
2584
+ if (!outstanding_send_.has_value()) return true;
2585
+ Poll<bool> r = (*outstanding_send_)();
2586
+ if (const bool* result = r.value_if_ready()) {
2587
+ if (grpc_call_trace.enabled()) {
2588
+ gpr_log(GPR_DEBUG, "%sPollSendMessage completes %s", DebugTag().c_str(),
2589
+ *result ? "successfully" : "with failure");
2590
+ }
2591
+ if (!*result) {
2592
+ FailCompletion(send_message_completion_);
2593
+ return false;
2594
+ }
2595
+ FinishOpOnCompletion(&send_message_completion_, PendingOp::kSendMessage);
2596
+ outstanding_send_.reset();
2597
+ }
2598
+ return true;
2599
+ }
2600
+
2601
+ void PromiseBasedCall::CancelSendMessage() {
2602
+ if (!outstanding_send_.has_value()) return;
2603
+ FinishOpOnCompletion(&send_message_completion_, PendingOp::kSendMessage);
2604
+ outstanding_send_.reset();
2605
+ }
2606
+
2607
+ void PromiseBasedCall::StartRecvMessage(const grpc_op& op,
2608
+ const Completion& completion,
2609
+ PipeReceiver<MessageHandle>* receiver) {
2610
+ GPR_ASSERT(!outstanding_recv_.has_value());
2611
+ recv_message_ = op.data.recv_message.recv_message;
2612
+ recv_message_completion_ =
2613
+ AddOpToCompletion(completion, PendingOp::kReceiveMessage);
2614
+ outstanding_recv_.emplace(receiver->Next());
2615
+ }
2616
+
2617
+ void PromiseBasedCall::PollRecvMessage(
2618
+ grpc_compression_algorithm incoming_compression_algorithm) {
2619
+ if (!outstanding_recv_.has_value()) return;
2620
+ Poll<NextResult<MessageHandle>> r = (*outstanding_recv_)();
2621
+ if (auto* result = r.value_if_ready()) {
2622
+ outstanding_recv_.reset();
2623
+ if (result->has_value()) {
2624
+ MessageHandle& message = **result;
2625
+ if ((message->flags() & GRPC_WRITE_INTERNAL_COMPRESS) &&
2626
+ (incoming_compression_algorithm != GRPC_COMPRESS_NONE)) {
2627
+ *recv_message_ = grpc_raw_compressed_byte_buffer_create(
2628
+ nullptr, 0, incoming_compression_algorithm);
2629
+ } else {
2630
+ *recv_message_ = grpc_raw_byte_buffer_create(nullptr, 0);
2631
+ }
2632
+ grpc_slice_buffer_move_into(message->payload()->c_slice_buffer(),
2633
+ &(*recv_message_)->data.raw.slice_buffer);
2634
+ if (grpc_call_trace.enabled()) {
2635
+ gpr_log(GPR_INFO,
2636
+ "%s[call] PollRecvMessage: outstanding_recv finishes: received "
2637
+ "%" PRIdPTR " byte message",
2638
+ DebugTag().c_str(),
2639
+ (*recv_message_)->data.raw.slice_buffer.length);
2640
+ }
2641
+ } else if (result->cancelled()) {
2642
+ if (grpc_call_trace.enabled()) {
2643
+ gpr_log(GPR_INFO,
2644
+ "%s[call] PollRecvMessage: outstanding_recv finishes: received "
2645
+ "end-of-stream with error",
2646
+ DebugTag().c_str());
2647
+ }
2648
+ FailCompletion(recv_message_completion_);
2649
+ *recv_message_ = nullptr;
2650
+ } else {
2651
+ if (grpc_call_trace.enabled()) {
2652
+ gpr_log(GPR_INFO,
2653
+ "%s[call] PollRecvMessage: outstanding_recv finishes: received "
2654
+ "end-of-stream",
2655
+ DebugTag().c_str());
2656
+ }
2657
+ *recv_message_ = nullptr;
2658
+ }
2659
+ FinishOpOnCompletion(&recv_message_completion_, PendingOp::kReceiveMessage);
2660
+ } else if (completed_) {
2661
+ if (grpc_call_trace.enabled()) {
2662
+ gpr_log(GPR_INFO,
2663
+ "%s[call] UpdateOnce: outstanding_recv finishes: promise has "
2664
+ "completed without queuing a message, forcing end-of-stream",
2665
+ DebugTag().c_str());
2666
+ }
2667
+ outstanding_recv_.reset();
2668
+ *recv_message_ = nullptr;
2669
+ FinishOpOnCompletion(&recv_message_completion_, PendingOp::kReceiveMessage);
2670
+ }
2671
+ }
2672
+
2673
+ void PromiseBasedCall::CancelRecvMessage() {
2674
+ if (!outstanding_recv_.has_value()) return;
2675
+ *recv_message_ = nullptr;
2676
+ outstanding_recv_.reset();
2677
+ FinishOpOnCompletion(&recv_message_completion_, PendingOp::kReceiveMessage);
2678
+ }
2679
+
2394
2680
  ///////////////////////////////////////////////////////////////////////////////
2395
2681
  // CallContext
2396
2682
 
@@ -2404,17 +2690,43 @@ void CallContext::IncrementRefCount(const char* reason) {
2404
2690
 
2405
2691
  void CallContext::Unref(const char* reason) { call_->InternalUnref(reason); }
2406
2692
 
2693
+ gpr_atm* CallContext::peer_string_atm_ptr() {
2694
+ return call_->peer_string_atm_ptr();
2695
+ }
2696
+
2407
2697
  void CallContext::UpdateDeadline(Timestamp deadline) {
2408
2698
  call_->UpdateDeadline(deadline);
2409
2699
  }
2410
2700
 
2701
+ ServerCallContext* CallContext::server_call_context() {
2702
+ return call_->server_call_context();
2703
+ }
2704
+
2705
+ ///////////////////////////////////////////////////////////////////////////////
2706
+ // PublishMetadataArray
2707
+
2708
+ namespace {
2709
+ void PublishMetadataArray(grpc_metadata_batch* md, grpc_metadata_array* array) {
2710
+ const auto md_count = md->count();
2711
+ if (md_count > array->capacity) {
2712
+ array->capacity =
2713
+ std::max(array->capacity + md->count(), array->capacity * 3 / 2);
2714
+ array->metadata = static_cast<grpc_metadata*>(
2715
+ gpr_realloc(array->metadata, sizeof(grpc_metadata) * array->capacity));
2716
+ }
2717
+ PublishToAppEncoder encoder(array);
2718
+ md->Encode(&encoder);
2719
+ }
2720
+ } // namespace
2721
+
2411
2722
  ///////////////////////////////////////////////////////////////////////////////
2412
2723
  // ClientPromiseBasedCall
2413
2724
 
2725
+ #ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_CLIENT_CALL
2414
2726
  class ClientPromiseBasedCall final : public PromiseBasedCall {
2415
2727
  public:
2416
2728
  ClientPromiseBasedCall(Arena* arena, grpc_call_create_args* args)
2417
- : PromiseBasedCall(arena, *args) {
2729
+ : PromiseBasedCall(arena, 1, *args) {
2418
2730
  global_stats().IncrementClientCallsCreated();
2419
2731
  ScopedContext context(this);
2420
2732
  send_initial_metadata_ =
@@ -2442,16 +2754,12 @@ class ClientPromiseBasedCall final : public PromiseBasedCall {
2442
2754
  // before context.
2443
2755
  auto c2s = std::move(client_to_server_messages_);
2444
2756
  auto s2c = std::move(server_to_client_messages_);
2757
+ auto sim = std::move(server_initial_metadata_);
2445
2758
  }
2446
2759
 
2447
2760
  absl::string_view GetServerAuthority() const override { abort(); }
2448
- void CancelWithError(grpc_error_handle error) override;
2449
- bool Completed() override;
2450
- void Orphan() override {
2451
- MutexLock lock(mu());
2452
- ScopedContext ctx(this);
2453
- if (!completed_) Finish(ServerMetadataFromStatus(absl::CancelledError()));
2454
- }
2761
+ void CancelWithErrorLocked(grpc_error_handle error) override
2762
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu());
2455
2763
  bool is_trailers_only() const override {
2456
2764
  MutexLock lock(mu());
2457
2765
  return is_trailers_only_;
@@ -2481,9 +2789,6 @@ class ClientPromiseBasedCall final : public PromiseBasedCall {
2481
2789
  // Start the underlying promise.
2482
2790
  void StartPromise(ClientMetadataHandle client_initial_metadata)
2483
2791
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu());
2484
- // Publish some metadata out to the application.
2485
- static void PublishMetadataArray(grpc_metadata_array* array,
2486
- ServerMetadata* md);
2487
2792
  // Publish status out to the application.
2488
2793
  void PublishStatus(
2489
2794
  grpc_op::grpc_op_data::grpc_op_recv_status_on_client op_args,
@@ -2494,29 +2799,23 @@ class ClientPromiseBasedCall final : public PromiseBasedCall {
2494
2799
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu());
2495
2800
 
2496
2801
  ArenaPromise<ServerMetadataHandle> promise_ ABSL_GUARDED_BY(mu());
2497
- Latch<ServerMetadata*> server_initial_metadata_ ABSL_GUARDED_BY(mu());
2802
+ Pipe<ServerMetadataHandle> server_initial_metadata_ ABSL_GUARDED_BY(mu()){
2803
+ arena()};
2498
2804
  Pipe<MessageHandle> client_to_server_messages_ ABSL_GUARDED_BY(mu()){arena()};
2499
2805
  Pipe<MessageHandle> server_to_client_messages_ ABSL_GUARDED_BY(mu()){arena()};
2500
2806
 
2501
2807
  ClientMetadataHandle send_initial_metadata_;
2502
2808
  grpc_metadata_array* recv_initial_metadata_ ABSL_GUARDED_BY(mu()) = nullptr;
2503
- grpc_byte_buffer** recv_message_ ABSL_GUARDED_BY(mu()) = nullptr;
2504
2809
  absl::variant<absl::monostate,
2505
2810
  grpc_op::grpc_op_data::grpc_op_recv_status_on_client,
2506
2811
  ServerMetadataHandle>
2507
2812
  recv_status_on_client_ ABSL_GUARDED_BY(mu());
2508
- absl::optional<PipeSender<MessageHandle>::PushType> outstanding_send_
2509
- ABSL_GUARDED_BY(mu());
2510
- absl::optional<PipeReceiver<MessageHandle>::NextType> outstanding_recv_
2511
- ABSL_GUARDED_BY(mu());
2512
- absl::optional<LatchWaitPromise<ServerMetadata*>>
2813
+ absl::optional<PipeReceiverNextType<ServerMetadataHandle>>
2513
2814
  server_initial_metadata_ready_;
2514
2815
  absl::optional<grpc_compression_algorithm> incoming_compression_algorithm_;
2515
2816
  Completion recv_initial_metadata_completion_ ABSL_GUARDED_BY(mu());
2516
2817
  Completion recv_status_on_client_completion_ ABSL_GUARDED_BY(mu());
2517
- Completion send_message_completion_ ABSL_GUARDED_BY(mu());
2518
- Completion recv_message_completion_ ABSL_GUARDED_BY(mu());
2519
- bool completed_ ABSL_GUARDED_BY(mu()) = false;
2818
+ Completion close_send_completion_ ABSL_GUARDED_BY(mu());
2520
2819
  bool is_trailers_only_ ABSL_GUARDED_BY(mu());
2521
2820
  };
2522
2821
 
@@ -2525,14 +2824,13 @@ void ClientPromiseBasedCall::StartPromise(
2525
2824
  GPR_ASSERT(!promise_.has_value());
2526
2825
  promise_ = channel()->channel_stack()->MakeClientCallPromise(CallArgs{
2527
2826
  std::move(client_initial_metadata),
2528
- &server_initial_metadata_,
2827
+ &server_initial_metadata_.sender,
2529
2828
  &client_to_server_messages_.receiver,
2530
2829
  &server_to_client_messages_.sender,
2531
2830
  });
2532
2831
  }
2533
2832
 
2534
- void ClientPromiseBasedCall::CancelWithError(grpc_error_handle error) {
2535
- MutexLock lock(mu());
2833
+ void ClientPromiseBasedCall::CancelWithErrorLocked(grpc_error_handle error) {
2536
2834
  ScopedContext context(this);
2537
2835
  Finish(ServerMetadataFromStatus(grpc_error_to_absl_status(error)));
2538
2836
  }
@@ -2582,7 +2880,7 @@ void ClientPromiseBasedCall::CommitBatch(const grpc_op* ops, size_t nops,
2582
2880
  // compression not implemented
2583
2881
  GPR_ASSERT(
2584
2882
  !op.data.send_initial_metadata.maybe_compression_level.is_set);
2585
- if (!completed_) {
2883
+ if (!completed()) {
2586
2884
  CToMetadata(op.data.send_initial_metadata.metadata,
2587
2885
  op.data.send_initial_metadata.count,
2588
2886
  send_initial_metadata_.get());
@@ -2592,7 +2890,8 @@ void ClientPromiseBasedCall::CommitBatch(const grpc_op* ops, size_t nops,
2592
2890
  case GRPC_OP_RECV_INITIAL_METADATA: {
2593
2891
  recv_initial_metadata_ =
2594
2892
  op.data.recv_initial_metadata.recv_initial_metadata;
2595
- server_initial_metadata_ready_.emplace(server_initial_metadata_.Wait());
2893
+ server_initial_metadata_ready_.emplace(
2894
+ server_initial_metadata_.receiver.Next());
2596
2895
  recv_initial_metadata_completion_ =
2597
2896
  AddOpToCompletion(completion, PendingOp::kReceiveInitialMetadata);
2598
2897
  } break;
@@ -2607,32 +2906,17 @@ void ClientPromiseBasedCall::CommitBatch(const grpc_op* ops, size_t nops,
2607
2906
  recv_status_on_client_ = op.data.recv_status_on_client;
2608
2907
  }
2609
2908
  } break;
2610
- case GRPC_OP_SEND_MESSAGE: {
2611
- GPR_ASSERT(!outstanding_send_.has_value());
2612
- if (!completed_) {
2613
- send_message_completion_ =
2614
- AddOpToCompletion(completion, PendingOp::kSendMessage);
2615
- SliceBuffer send;
2616
- grpc_slice_buffer_swap(
2617
- &op.data.send_message.send_message->data.raw.slice_buffer,
2618
- send.c_slice_buffer());
2619
- outstanding_send_.emplace(client_to_server_messages_.sender.Push(
2620
- GetContext<Arena>()->MakePooled<Message>(std::move(send),
2621
- op.flags)));
2622
- } else {
2623
- FailCompletion(completion);
2624
- }
2625
- } break;
2626
- case GRPC_OP_RECV_MESSAGE: {
2627
- GPR_ASSERT(!outstanding_recv_.has_value());
2628
- recv_message_ = op.data.recv_message.recv_message;
2629
- recv_message_completion_ =
2630
- AddOpToCompletion(completion, PendingOp::kReceiveMessage);
2631
- outstanding_recv_.emplace(server_to_client_messages_.receiver.Next());
2632
- } break;
2633
- case GRPC_OP_SEND_CLOSE_FROM_CLIENT: {
2634
- client_to_server_messages_.sender.Close();
2635
- } break;
2909
+ case GRPC_OP_SEND_MESSAGE:
2910
+ StartSendMessage(op, completion, &client_to_server_messages_.sender);
2911
+ break;
2912
+ case GRPC_OP_RECV_MESSAGE:
2913
+ StartRecvMessage(op, completion, &server_to_client_messages_.receiver);
2914
+ break;
2915
+ case GRPC_OP_SEND_CLOSE_FROM_CLIENT:
2916
+ close_send_completion_ =
2917
+ AddOpToCompletion(completion, PendingOp::kSendCloseFromClient);
2918
+ GPR_ASSERT(close_send_completion_.has_value());
2919
+ break;
2636
2920
  case GRPC_OP_SEND_STATUS_FROM_SERVER:
2637
2921
  case GRPC_OP_RECV_CLOSE_ON_SERVER:
2638
2922
  abort(); // unreachable
@@ -2667,153 +2951,83 @@ void ClientPromiseBasedCall::PublishInitialMetadata(ServerMetadata* metadata) {
2667
2951
  metadata->Take(GrpcEncodingMetadata()).value_or(GRPC_COMPRESS_NONE);
2668
2952
  server_initial_metadata_ready_.reset();
2669
2953
  GPR_ASSERT(recv_initial_metadata_ != nullptr);
2670
- PublishMetadataArray(std::exchange(recv_initial_metadata_, nullptr),
2671
- metadata);
2954
+ PublishMetadataArray(metadata,
2955
+ std::exchange(recv_initial_metadata_, nullptr));
2672
2956
  FinishOpOnCompletion(&recv_initial_metadata_completion_,
2673
2957
  PendingOp::kReceiveInitialMetadata);
2674
2958
  }
2675
2959
 
2676
2960
  void ClientPromiseBasedCall::UpdateOnce() {
2677
2961
  if (grpc_call_trace.enabled()) {
2678
- auto present_and_completion_text =
2679
- [](const char* caption, bool has,
2680
- const Completion& completion) -> std::string {
2681
- if (has) {
2682
- if (completion.has_value()) {
2683
- return absl::StrCat(caption, ":",
2684
- static_cast<int>(completion.index()), " ");
2685
- } else {
2686
- return absl::StrCat(caption,
2687
- ":!!BUG:operation is present, no completion!! ");
2688
- }
2689
- } else {
2690
- if (!completion.has_value()) {
2691
- return "";
2692
- } else {
2693
- return absl::StrCat(
2694
- caption, ":no-op:", static_cast<int>(completion.index()), " ");
2695
- }
2696
- }
2697
- };
2698
- gpr_log(
2699
- GPR_INFO, "%sUpdateOnce: %s%s%shas_promise=%s", DebugTag().c_str(),
2700
- present_and_completion_text("server_initial_metadata_ready",
2701
- server_initial_metadata_ready_.has_value(),
2702
- recv_initial_metadata_completion_)
2703
- .c_str(),
2704
- present_and_completion_text("outstanding_send",
2705
- outstanding_send_.has_value(),
2706
- send_message_completion_)
2707
- .c_str(),
2708
- present_and_completion_text("outstanding_recv",
2709
- outstanding_recv_.has_value(),
2710
- recv_message_completion_)
2711
- .c_str(),
2712
- promise_.has_value() ? "true" : "false");
2713
- }
2714
- if (send_message_completion_.has_value()) {
2715
- FinishOpOnCompletion(&send_message_completion_, PendingOp::kSendMessage);
2962
+ gpr_log(GPR_INFO, "%s[call] UpdateOnce: %s%shas_promise=%s",
2963
+ DebugTag().c_str(),
2964
+ PresentAndCompletionText("server_initial_metadata_ready",
2965
+ server_initial_metadata_ready_.has_value(),
2966
+ recv_initial_metadata_completion_)
2967
+ .c_str(),
2968
+ PollStateDebugString().c_str(),
2969
+ promise_.has_value() ? "true" : "false");
2716
2970
  }
2717
2971
  if (server_initial_metadata_ready_.has_value()) {
2718
- Poll<ServerMetadata**> r = (*server_initial_metadata_ready_)();
2719
- if (ServerMetadata*** server_initial_metadata =
2720
- absl::get_if<ServerMetadata**>(&r)) {
2721
- PublishInitialMetadata(**server_initial_metadata);
2722
- } else if (completed_) {
2972
+ Poll<NextResult<ServerMetadataHandle>> r =
2973
+ (*server_initial_metadata_ready_)();
2974
+ if (auto* server_initial_metadata = r.value_if_ready()) {
2975
+ PublishInitialMetadata(server_initial_metadata->value().get());
2976
+ } else if (completed()) {
2723
2977
  ServerMetadata no_metadata{GetContext<Arena>()};
2724
2978
  PublishInitialMetadata(&no_metadata);
2725
2979
  }
2726
2980
  }
2727
- if (outstanding_send_.has_value()) {
2728
- Poll<bool> r = (*outstanding_send_)();
2729
- if (const bool* result = absl::get_if<bool>(&r)) {
2730
- outstanding_send_.reset();
2731
- if (!*result) {
2732
- FailCompletion(send_message_completion_);
2733
- Finish(ServerMetadataFromStatus(absl::Status(
2734
- absl::StatusCode::kInternal, "Failed to send message to server")));
2735
- }
2736
- }
2981
+ if (!PollSendMessage()) {
2982
+ Finish(ServerMetadataFromStatus(absl::Status(
2983
+ absl::StatusCode::kInternal, "Failed to send message to server")));
2984
+ }
2985
+ if (!is_sending() && close_send_completion_.has_value()) {
2986
+ client_to_server_messages_.sender.Close();
2987
+ FinishOpOnCompletion(&close_send_completion_,
2988
+ PendingOp::kSendCloseFromClient);
2737
2989
  }
2738
2990
  if (promise_.has_value()) {
2739
2991
  Poll<ServerMetadataHandle> r = promise_();
2740
2992
  if (grpc_call_trace.enabled()) {
2741
- gpr_log(GPR_INFO, "%sUpdateOnce: promise returns %s", DebugTag().c_str(),
2993
+ gpr_log(GPR_INFO, "%s[call] UpdateOnce: promise returns %s",
2994
+ DebugTag().c_str(),
2742
2995
  PollToString(r, [](const ServerMetadataHandle& h) {
2743
2996
  return h->DebugString();
2744
2997
  }).c_str());
2745
2998
  }
2746
- if (auto* result = absl::get_if<ServerMetadataHandle>(&r)) {
2999
+ if (auto* result = r.value_if_ready()) {
2747
3000
  AcceptTransportStatsFromContext();
2748
3001
  Finish(std::move(*result));
2749
3002
  }
2750
3003
  }
2751
- if (incoming_compression_algorithm_.has_value() &&
2752
- outstanding_recv_.has_value()) {
2753
- Poll<NextResult<MessageHandle>> r = (*outstanding_recv_)();
2754
- if (auto* result = absl::get_if<NextResult<MessageHandle>>(&r)) {
2755
- outstanding_recv_.reset();
2756
- if (result->has_value()) {
2757
- MessageHandle& message = **result;
2758
- if ((message->flags() & GRPC_WRITE_INTERNAL_COMPRESS) &&
2759
- (incoming_compression_algorithm_ != GRPC_COMPRESS_NONE)) {
2760
- *recv_message_ = grpc_raw_compressed_byte_buffer_create(
2761
- nullptr, 0, *incoming_compression_algorithm_);
2762
- } else {
2763
- *recv_message_ = grpc_raw_byte_buffer_create(nullptr, 0);
2764
- }
2765
- grpc_slice_buffer_move_into(message->payload()->c_slice_buffer(),
2766
- &(*recv_message_)->data.raw.slice_buffer);
2767
- if (grpc_call_trace.enabled()) {
2768
- gpr_log(GPR_INFO,
2769
- "%sUpdateOnce: outstanding_recv finishes: received %" PRIdPTR
2770
- " byte message",
2771
- DebugTag().c_str(),
2772
- (*recv_message_)->data.raw.slice_buffer.length);
2773
- }
2774
- } else {
2775
- if (grpc_call_trace.enabled()) {
2776
- gpr_log(
2777
- GPR_INFO,
2778
- "%sUpdateOnce: outstanding_recv finishes: received end-of-stream",
2779
- DebugTag().c_str());
2780
- }
2781
- *recv_message_ = nullptr;
2782
- }
2783
- FinishOpOnCompletion(&recv_message_completion_,
2784
- PendingOp::kReceiveMessage);
2785
- } else if (completed_) {
2786
- if (grpc_call_trace.enabled()) {
2787
- gpr_log(GPR_INFO,
2788
- "%sUpdateOnce: outstanding_recv finishes: promise has "
2789
- "completed without queuing a message, forcing end-of-stream",
2790
- DebugTag().c_str());
2791
- }
2792
- outstanding_recv_.reset();
2793
- *recv_message_ = nullptr;
2794
- FinishOpOnCompletion(&recv_message_completion_,
2795
- PendingOp::kReceiveMessage);
2796
- }
3004
+ if (incoming_compression_algorithm_.has_value()) {
3005
+ PollRecvMessage(*incoming_compression_algorithm_);
2797
3006
  }
2798
3007
  }
2799
3008
 
2800
3009
  void ClientPromiseBasedCall::Finish(ServerMetadataHandle trailing_metadata) {
2801
3010
  if (grpc_call_trace.enabled()) {
2802
- gpr_log(GPR_INFO, "%sFinish: %s", DebugTag().c_str(),
3011
+ gpr_log(GPR_INFO, "%s[call] Finish: %s", DebugTag().c_str(),
2803
3012
  trailing_metadata->DebugString().c_str());
2804
3013
  }
2805
3014
  promise_ = ArenaPromise<ServerMetadataHandle>();
2806
3015
  ResetDeadline();
2807
- completed_ = true;
3016
+ set_completed();
2808
3017
  if (recv_initial_metadata_ != nullptr) {
2809
3018
  ForceImmediateRepoll();
2810
3019
  }
2811
3020
  const bool pending_initial_metadata =
2812
3021
  server_initial_metadata_ready_.has_value();
3022
+ if (!pending_initial_metadata) {
3023
+ server_initial_metadata_ready_.emplace(
3024
+ server_initial_metadata_.receiver.Next());
3025
+ }
3026
+ Poll<NextResult<ServerMetadataHandle>> r =
3027
+ (*server_initial_metadata_ready_)();
2813
3028
  server_initial_metadata_ready_.reset();
2814
- Poll<ServerMetadata**> r = server_initial_metadata_.Wait()();
2815
- if (auto* result = absl::get_if<ServerMetadata**>(&r)) {
2816
- if (pending_initial_metadata) PublishInitialMetadata(**result);
3029
+ if (auto* result = r.value_if_ready()) {
3030
+ if (pending_initial_metadata) PublishInitialMetadata(result->value().get());
2817
3031
  is_trailers_only_ = false;
2818
3032
  } else {
2819
3033
  if (pending_initial_metadata) {
@@ -2885,36 +3099,429 @@ void ClientPromiseBasedCall::PublishStatus(
2885
3099
  *op_args.error_string =
2886
3100
  gpr_strdup(MakeErrorString(trailing_metadata.get()).c_str());
2887
3101
  }
2888
- PublishMetadataArray(op_args.trailing_metadata, trailing_metadata.get());
3102
+ PublishMetadataArray(trailing_metadata.get(), op_args.trailing_metadata);
2889
3103
  // Clear state saying we have a RECV_STATUS_ON_CLIENT outstanding
2890
3104
  // (so we don't call through twice)
2891
3105
  recv_status_on_client_ = absl::monostate();
2892
3106
  FinishOpOnCompletion(&recv_status_on_client_completion_,
2893
3107
  PendingOp::kReceiveStatusOnClient);
2894
3108
  }
3109
+ #endif
2895
3110
 
2896
- void ClientPromiseBasedCall::PublishMetadataArray(grpc_metadata_array* array,
2897
- ServerMetadata* md) {
2898
- const auto md_count = md->count();
2899
- if (md_count > array->capacity) {
2900
- array->capacity =
2901
- std::max(array->capacity + md->count(), array->capacity * 3 / 2);
2902
- array->metadata = static_cast<grpc_metadata*>(
2903
- gpr_realloc(array->metadata, sizeof(grpc_metadata) * array->capacity));
3111
+ ///////////////////////////////////////////////////////////////////////////////
3112
+ // ServerPromiseBasedCall
3113
+
3114
+ #ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_SERVER_CALL
3115
+
3116
+ class ServerPromiseBasedCall final : public PromiseBasedCall {
3117
+ public:
3118
+ ServerPromiseBasedCall(Arena* arena, grpc_call_create_args* args);
3119
+
3120
+ void CancelWithErrorLocked(grpc_error_handle) override
3121
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu());
3122
+ grpc_call_error StartBatch(const grpc_op* ops, size_t nops, void* notify_tag,
3123
+ bool is_notify_tag_closure) override;
3124
+ bool failed_before_recv_message() const override { abort(); }
3125
+ bool is_trailers_only() const override { abort(); }
3126
+ absl::string_view GetServerAuthority() const override { return ""; }
3127
+
3128
+ // Polling order for the server promise stack:
3129
+ //
3130
+ // │ ┌───────────────────────────────────────┐
3131
+ // │ │ ServerPromiseBasedCall::UpdateOnce ├──► Lifetime management,
3132
+ // │ ├───────────────────────────────────────┤ signal call end to app
3133
+ // │ │ ConnectedChannel ├─┐
3134
+ // │ ├───────────────────────────────────────┤ └► Interactions with the
3135
+ // │ │ ... closest to transport filter │ transport - send/recv msgs
3136
+ // │ ├───────────────────────────────────────┤ and metadata, call phase
3137
+ // │ │ ... │ ordering
3138
+ // │ ├───────────────────────────────────────┤
3139
+ // │ │ ... closest to app filter │ ┌► Request matching, initial
3140
+ // │ ├───────────────────────────────────────┤ │ setup, publishing call to
3141
+ // │ │ Server::ChannelData::MakeCallPromise ├─┘ application
3142
+ // │ ├───────────────────────────────────────┤
3143
+ // │ │ ServerPromiseBasedCall::PollTopOfCall ├──► Application interactions,
3144
+ // ▼ └───────────────────────────────────────┘ forwarding messages,
3145
+ // Polling & sending trailing metadata
3146
+ // instantiation
3147
+ // order
3148
+
3149
+ void UpdateOnce() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu()) override;
3150
+ Poll<ServerMetadataHandle> PollTopOfCall()
3151
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu());
3152
+
3153
+ std::string DebugTag() const override {
3154
+ return absl::StrFormat("SERVER_CALL[%p]: ", this);
2904
3155
  }
2905
- PublishToAppEncoder encoder(array);
2906
- md->Encode(&encoder);
3156
+
3157
+ ServerCallContext* server_call_context() override { return &call_context_; }
3158
+
3159
+ private:
3160
+ class RecvCloseOpCancelState {
3161
+ public:
3162
+ // Request that receiver be filled in per grpc_op_recv_close_on_server.
3163
+ // Returns true if the request can be fulfilled immediately.
3164
+ // Returns false if the request will be fulfilled later.
3165
+ bool ReceiveCloseOnServerOpStarted(int* receiver) {
3166
+ switch (state_) {
3167
+ case kUnset:
3168
+ state_ = reinterpret_cast<uintptr_t>(receiver);
3169
+ return false;
3170
+ case kFinishedWithFailure:
3171
+ *receiver = 1;
3172
+ return true;
3173
+ case kFinishedWithSuccess:
3174
+ *receiver = 0;
3175
+ return true;
3176
+ default:
3177
+ abort(); // unreachable
3178
+ }
3179
+ }
3180
+
3181
+ // Mark the call as having completed.
3182
+ // Returns true if this finishes a previous RequestReceiveCloseOnServer.
3183
+ bool CompleteCall(bool success) {
3184
+ switch (state_) {
3185
+ case kUnset:
3186
+ state_ = success ? kFinishedWithSuccess : kFinishedWithFailure;
3187
+ return false;
3188
+ case kFinishedWithFailure:
3189
+ case kFinishedWithSuccess:
3190
+ abort(); // unreachable
3191
+ default:
3192
+ *reinterpret_cast<int*>(state_) = success ? 0 : 1;
3193
+ state_ = success ? kFinishedWithSuccess : kFinishedWithFailure;
3194
+ return true;
3195
+ }
3196
+ }
3197
+
3198
+ std::string ToString() const {
3199
+ switch (state_) {
3200
+ case kUnset:
3201
+ return "Unset";
3202
+ case kFinishedWithFailure:
3203
+ return "FinishedWithFailure";
3204
+ case kFinishedWithSuccess:
3205
+ return "FinishedWithSuccess";
3206
+ default:
3207
+ return absl::StrFormat("WaitingForReceiver(%p)",
3208
+ reinterpret_cast<void*>(state_));
3209
+ }
3210
+ }
3211
+
3212
+ private:
3213
+ static constexpr uintptr_t kUnset = 0;
3214
+ static constexpr uintptr_t kFinishedWithFailure = 1;
3215
+ static constexpr uintptr_t kFinishedWithSuccess = 2;
3216
+ // Holds one of kUnset, kFinishedWithFailure, or kFinishedWithSuccess
3217
+ // OR an int* that wants to receive the final status.
3218
+ uintptr_t state_ = kUnset;
3219
+ };
3220
+
3221
+ grpc_call_error ValidateBatch(const grpc_op* ops, size_t nops) const;
3222
+ void CommitBatch(const grpc_op* ops, size_t nops,
3223
+ const Completion& completion)
3224
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu());
3225
+
3226
+ friend class ServerCallContext;
3227
+ ServerCallContext call_context_;
3228
+ Server* const server_;
3229
+ ArenaPromise<ServerMetadataHandle> promise_ ABSL_GUARDED_BY(mu());
3230
+ PipeSender<MessageHandle>* server_to_client_messages_ ABSL_GUARDED_BY(mu()) =
3231
+ nullptr;
3232
+ PipeReceiver<MessageHandle>* client_to_server_messages_
3233
+ ABSL_GUARDED_BY(mu()) = nullptr;
3234
+ using SendInitialMetadataState =
3235
+ absl::variant<absl::monostate, PipeSender<ServerMetadataHandle>*,
3236
+ typename PipeSender<ServerMetadataHandle>::PushType>;
3237
+ SendInitialMetadataState send_initial_metadata_state_ ABSL_GUARDED_BY(mu()) =
3238
+ absl::monostate{};
3239
+ ServerMetadataHandle send_trailing_metadata_ ABSL_GUARDED_BY(mu());
3240
+ grpc_compression_algorithm incoming_compression_algorithm_
3241
+ ABSL_GUARDED_BY(mu());
3242
+ RecvCloseOpCancelState recv_close_op_cancel_state_ ABSL_GUARDED_BY(mu());
3243
+ Completion recv_close_completion_ ABSL_GUARDED_BY(mu());
3244
+ bool cancel_send_and_receive_ ABSL_GUARDED_BY(mu()) = false;
3245
+ Completion send_status_from_server_completion_ ABSL_GUARDED_BY(mu());
3246
+ ClientMetadataHandle client_initial_metadata_ ABSL_GUARDED_BY(mu());
3247
+ };
3248
+
3249
+ ServerPromiseBasedCall::ServerPromiseBasedCall(Arena* arena,
3250
+ grpc_call_create_args* args)
3251
+ : PromiseBasedCall(arena, 0, *args),
3252
+ call_context_(this, args->server_transport_data),
3253
+ server_(args->server) {
3254
+ global_stats().IncrementServerCallsCreated();
3255
+ channelz::ServerNode* channelz_node = server_->channelz_node();
3256
+ if (channelz_node != nullptr) {
3257
+ channelz_node->RecordCallStarted();
3258
+ }
3259
+ MutexLock lock(mu());
3260
+ ScopedContext activity_context(this);
3261
+ promise_ = channel()->channel_stack()->MakeServerCallPromise(
3262
+ CallArgs{nullptr, nullptr, nullptr, nullptr});
2907
3263
  }
2908
3264
 
2909
- bool ClientPromiseBasedCall::Completed() {
3265
+ Poll<ServerMetadataHandle> ServerPromiseBasedCall::PollTopOfCall() {
3266
+ if (grpc_call_trace.enabled()) {
3267
+ gpr_log(GPR_INFO, "%s[call] PollTopOfCall: %s%s%s", DebugTag().c_str(),
3268
+ cancel_send_and_receive_ ? "force-" : "",
3269
+ send_trailing_metadata_ != nullptr
3270
+ ? absl::StrCat("send-metadata:",
3271
+ send_trailing_metadata_->DebugString(), " ")
3272
+ .c_str()
3273
+ : " ",
3274
+ PollStateDebugString().c_str());
3275
+ }
3276
+
3277
+ if (cancel_send_and_receive_) {
3278
+ CancelSendMessage();
3279
+ CancelRecvMessage();
3280
+ }
3281
+
3282
+ PollSendMessage();
3283
+ PollRecvMessage(incoming_compression_algorithm_);
3284
+
3285
+ if (!is_sending() && send_trailing_metadata_ != nullptr) {
3286
+ server_to_client_messages_->Close();
3287
+ return std::move(send_trailing_metadata_);
3288
+ }
3289
+
3290
+ return Pending{};
3291
+ }
3292
+
3293
+ void ServerPromiseBasedCall::UpdateOnce() {
3294
+ if (grpc_call_trace.enabled()) {
3295
+ gpr_log(
3296
+ GPR_INFO, "%s[call] UpdateOnce: recv_close:%s%s %s%shas_promise=%s",
3297
+ DebugTag().c_str(), recv_close_op_cancel_state_.ToString().c_str(),
3298
+ recv_close_completion_.has_value()
3299
+ ? absl::StrCat(":", CompletionString(recv_close_completion_))
3300
+ .c_str()
3301
+ : "",
3302
+ send_status_from_server_completion_.has_value()
3303
+ ? absl::StrCat(
3304
+ "send_status:",
3305
+ CompletionString(send_status_from_server_completion_), " ")
3306
+ .c_str()
3307
+ : "",
3308
+ PollStateDebugString().c_str(),
3309
+ promise_.has_value() ? "true" : "false");
3310
+ }
3311
+ if (auto* p =
3312
+ absl::get_if<typename PipeSender<ServerMetadataHandle>::PushType>(
3313
+ &send_initial_metadata_state_)) {
3314
+ if ((*p)().ready()) {
3315
+ send_initial_metadata_state_ = absl::monostate{};
3316
+ }
3317
+ }
3318
+ if (promise_.has_value()) {
3319
+ auto r = promise_();
3320
+ if (grpc_call_trace.enabled()) {
3321
+ gpr_log(GPR_INFO, "%s[call] UpdateOnce: promise returns %s",
3322
+ DebugTag().c_str(),
3323
+ PollToString(r, [](const ServerMetadataHandle& h) {
3324
+ return h->DebugString();
3325
+ }).c_str());
3326
+ }
3327
+ if (auto* result = r.value_if_ready()) {
3328
+ if (grpc_call_trace.enabled()) {
3329
+ gpr_log(GPR_INFO, "%s[call] UpdateOnce: GotResult %s result:%s",
3330
+ DebugTag().c_str(),
3331
+ recv_close_op_cancel_state_.ToString().c_str(),
3332
+ (*result)->DebugString().c_str());
3333
+ }
3334
+ if (recv_close_op_cancel_state_.CompleteCall(
3335
+ (*result)->get(GrpcStatusFromWire()).value_or(false))) {
3336
+ FinishOpOnCompletion(&recv_close_completion_,
3337
+ PendingOp::kReceiveCloseOnServer);
3338
+ }
3339
+ channelz::ServerNode* channelz_node = server_->channelz_node();
3340
+ if (channelz_node != nullptr) {
3341
+ if ((*result)
3342
+ ->get(GrpcStatusMetadata())
3343
+ .value_or(GRPC_STATUS_UNKNOWN) == GRPC_STATUS_OK) {
3344
+ channelz_node->RecordCallSucceeded();
3345
+ } else {
3346
+ channelz_node->RecordCallFailed();
3347
+ }
3348
+ }
3349
+ if (send_status_from_server_completion_.has_value()) {
3350
+ FinishOpOnCompletion(&send_status_from_server_completion_,
3351
+ PendingOp::kSendStatusFromServer);
3352
+ }
3353
+ CancelSendMessage();
3354
+ CancelRecvMessage();
3355
+ set_completed();
3356
+ promise_ = ArenaPromise<ServerMetadataHandle>();
3357
+ }
3358
+ }
3359
+ }
3360
+
3361
+ grpc_call_error ServerPromiseBasedCall::ValidateBatch(const grpc_op* ops,
3362
+ size_t nops) const {
3363
+ BitSet<8> got_ops;
3364
+ for (size_t op_idx = 0; op_idx < nops; op_idx++) {
3365
+ const grpc_op& op = ops[op_idx];
3366
+ switch (op.op) {
3367
+ case GRPC_OP_SEND_INITIAL_METADATA:
3368
+ if (!AreInitialMetadataFlagsValid(op.flags)) {
3369
+ return GRPC_CALL_ERROR_INVALID_FLAGS;
3370
+ }
3371
+ if (!ValidateMetadata(op.data.send_initial_metadata.count,
3372
+ op.data.send_initial_metadata.metadata)) {
3373
+ return GRPC_CALL_ERROR_INVALID_METADATA;
3374
+ }
3375
+ break;
3376
+ case GRPC_OP_SEND_MESSAGE:
3377
+ if (!AreWriteFlagsValid(op.flags)) {
3378
+ return GRPC_CALL_ERROR_INVALID_FLAGS;
3379
+ }
3380
+ break;
3381
+ case GRPC_OP_RECV_MESSAGE:
3382
+ case GRPC_OP_RECV_CLOSE_ON_SERVER:
3383
+ case GRPC_OP_SEND_STATUS_FROM_SERVER:
3384
+ if (op.flags != 0) return GRPC_CALL_ERROR_INVALID_FLAGS;
3385
+ break;
3386
+ case GRPC_OP_RECV_INITIAL_METADATA:
3387
+ case GRPC_OP_SEND_CLOSE_FROM_CLIENT:
3388
+ case GRPC_OP_RECV_STATUS_ON_CLIENT:
3389
+ return GRPC_CALL_ERROR_NOT_ON_SERVER;
3390
+ }
3391
+ if (got_ops.is_set(op.op)) return GRPC_CALL_ERROR_TOO_MANY_OPERATIONS;
3392
+ got_ops.set(op.op);
3393
+ }
3394
+ return GRPC_CALL_OK;
3395
+ }
3396
+
3397
+ void ServerPromiseBasedCall::CommitBatch(const grpc_op* ops, size_t nops,
3398
+ const Completion& completion) {
3399
+ for (size_t op_idx = 0; op_idx < nops; op_idx++) {
3400
+ const grpc_op& op = ops[op_idx];
3401
+ switch (op.op) {
3402
+ case GRPC_OP_SEND_INITIAL_METADATA: {
3403
+ // compression not implemented
3404
+ GPR_ASSERT(
3405
+ !op.data.send_initial_metadata.maybe_compression_level.is_set);
3406
+ if (!completed()) {
3407
+ auto metadata = arena()->MakePooled<ServerMetadata>(arena());
3408
+ CToMetadata(op.data.send_initial_metadata.metadata,
3409
+ op.data.send_initial_metadata.count, metadata.get());
3410
+ if (grpc_call_trace.enabled()) {
3411
+ gpr_log(GPR_INFO, "%s[call] Send initial metadata",
3412
+ DebugTag().c_str());
3413
+ }
3414
+ auto* pipe = absl::get<PipeSender<ServerMetadataHandle>*>(
3415
+ send_initial_metadata_state_);
3416
+ send_initial_metadata_state_ = pipe->Push(std::move(metadata));
3417
+ }
3418
+ } break;
3419
+ case GRPC_OP_SEND_MESSAGE:
3420
+ StartSendMessage(op, completion, server_to_client_messages_);
3421
+ break;
3422
+ case GRPC_OP_RECV_MESSAGE:
3423
+ StartRecvMessage(op, completion, client_to_server_messages_);
3424
+ break;
3425
+ case GRPC_OP_SEND_STATUS_FROM_SERVER:
3426
+ send_trailing_metadata_ = arena()->MakePooled<ServerMetadata>(arena());
3427
+ CToMetadata(op.data.send_status_from_server.trailing_metadata,
3428
+ op.data.send_status_from_server.trailing_metadata_count,
3429
+ send_trailing_metadata_.get());
3430
+ send_trailing_metadata_->Set(GrpcStatusMetadata(),
3431
+ op.data.send_status_from_server.status);
3432
+ if (auto* details = op.data.send_status_from_server.status_details) {
3433
+ send_trailing_metadata_->Set(GrpcMessageMetadata(),
3434
+ Slice(CSliceRef(*details)));
3435
+ }
3436
+ send_status_from_server_completion_ =
3437
+ AddOpToCompletion(completion, PendingOp::kSendStatusFromServer);
3438
+ break;
3439
+ case GRPC_OP_RECV_CLOSE_ON_SERVER:
3440
+ if (grpc_call_trace.enabled()) {
3441
+ gpr_log(GPR_INFO, "%s[call] StartBatch: RecvClose %s",
3442
+ DebugTag().c_str(),
3443
+ recv_close_op_cancel_state_.ToString().c_str());
3444
+ }
3445
+ if (!recv_close_op_cancel_state_.ReceiveCloseOnServerOpStarted(
3446
+ op.data.recv_close_on_server.cancelled)) {
3447
+ recv_close_completion_ =
3448
+ AddOpToCompletion(completion, PendingOp::kReceiveCloseOnServer);
3449
+ }
3450
+ break;
3451
+ case GRPC_OP_RECV_STATUS_ON_CLIENT:
3452
+ case GRPC_OP_SEND_CLOSE_FROM_CLIENT:
3453
+ case GRPC_OP_RECV_INITIAL_METADATA:
3454
+ abort(); // unreachable
3455
+ }
3456
+ }
3457
+ }
3458
+
3459
+ grpc_call_error ServerPromiseBasedCall::StartBatch(const grpc_op* ops,
3460
+ size_t nops,
3461
+ void* notify_tag,
3462
+ bool is_notify_tag_closure) {
2910
3463
  MutexLock lock(mu());
2911
- return completed_;
3464
+ ScopedContext activity_context(this);
3465
+ if (nops == 0) {
3466
+ EndOpImmediately(cq(), notify_tag, is_notify_tag_closure);
3467
+ return GRPC_CALL_OK;
3468
+ }
3469
+ const grpc_call_error validation_result = ValidateBatch(ops, nops);
3470
+ if (validation_result != GRPC_CALL_OK) {
3471
+ return validation_result;
3472
+ }
3473
+ Completion completion =
3474
+ StartCompletion(notify_tag, is_notify_tag_closure, ops);
3475
+ CommitBatch(ops, nops, completion);
3476
+ Update();
3477
+ FinishOpOnCompletion(&completion, PendingOp::kStartingBatch);
3478
+ return GRPC_CALL_OK;
2912
3479
  }
2913
3480
 
2914
- gpr_atm* CallContext::peer_string_atm_ptr() {
2915
- return call_->peer_string_atm_ptr();
3481
+ void ServerPromiseBasedCall::CancelWithErrorLocked(absl::Status error) {
3482
+ if (!promise_.has_value()) return;
3483
+ cancel_send_and_receive_ = true;
3484
+ send_trailing_metadata_ = ServerMetadataFromStatus(error, arena());
3485
+ ForceWakeup();
2916
3486
  }
2917
3487
 
3488
+ #endif
3489
+
3490
+ #ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_SERVER_CALL
3491
+ ArenaPromise<ServerMetadataHandle>
3492
+ ServerCallContext::MakeTopOfServerCallPromise(
3493
+ CallArgs call_args, grpc_completion_queue* cq,
3494
+ grpc_metadata_array* publish_initial_metadata,
3495
+ absl::FunctionRef<void(grpc_call* call)> publish) {
3496
+ call_->mu()->AssertHeld();
3497
+ call_->SetCompletionQueueLocked(cq);
3498
+ call_->server_to_client_messages_ = call_args.server_to_client_messages;
3499
+ call_->client_to_server_messages_ = call_args.client_to_server_messages;
3500
+ call_->send_initial_metadata_state_ = call_args.server_initial_metadata;
3501
+ call_->incoming_compression_algorithm_ =
3502
+ call_args.client_initial_metadata->get(GrpcEncodingMetadata())
3503
+ .value_or(GRPC_COMPRESS_NONE);
3504
+ call_->client_initial_metadata_ =
3505
+ std::move(call_args.client_initial_metadata);
3506
+ PublishMetadataArray(call_->client_initial_metadata_.get(),
3507
+ publish_initial_metadata);
3508
+ call_->ExternalRef();
3509
+ publish(call_->c_ptr());
3510
+ return [this]() {
3511
+ call_->mu()->AssertHeld();
3512
+ return call_->PollTopOfCall();
3513
+ };
3514
+ }
3515
+ #else
3516
+ ArenaPromise<ServerMetadataHandle>
3517
+ ServerCallContext::MakeTopOfServerCallPromise(
3518
+ CallArgs, grpc_completion_queue*, grpc_metadata_array*,
3519
+ absl::FunctionRef<void(grpc_call*)>) {
3520
+ (void)call_;
3521
+ Crash("Promise-based server call is not enabled");
3522
+ }
3523
+ #endif
3524
+
2918
3525
  } // namespace grpc_core
2919
3526
 
2920
3527
  ///////////////////////////////////////////////////////////////////////////////
@@ -2931,13 +3538,20 @@ size_t grpc_call_get_initial_size_estimate() {
2931
3538
 
2932
3539
  grpc_error_handle grpc_call_create(grpc_call_create_args* args,
2933
3540
  grpc_call** out_call) {
3541
+ #ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_CLIENT_CALL
2934
3542
  if (grpc_core::IsPromiseBasedClientCallEnabled() &&
2935
- args->channel->is_promising()) {
2936
- if (args->server_transport_data == nullptr) {
2937
- return grpc_core::MakePromiseBasedCall<grpc_core::ClientPromiseBasedCall>(
2938
- args, out_call);
2939
- }
3543
+ args->server_transport_data == nullptr && args->channel->is_promising()) {
3544
+ return grpc_core::MakePromiseBasedCall<grpc_core::ClientPromiseBasedCall>(
3545
+ args, out_call);
2940
3546
  }
3547
+ #endif
3548
+ #ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_SERVER_CALL
3549
+ if (grpc_core::IsPromiseBasedServerCallEnabled() &&
3550
+ args->server_transport_data != nullptr && args->channel->is_promising()) {
3551
+ return grpc_core::MakePromiseBasedCall<grpc_core::ServerPromiseBasedCall>(
3552
+ args, out_call);
3553
+ }
3554
+ #endif
2941
3555
  return grpc_core::FilterStackCall::Create(args, out_call);
2942
3556
  }
2943
3557