grpc 1.65.2 → 1.66.0.pre3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (799) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +17 -7
  3. data/include/grpc/event_engine/event_engine.h +14 -0
  4. data/include/grpc/event_engine/extensible.h +3 -0
  5. data/include/grpc/event_engine/memory_request.h +18 -0
  6. data/include/grpc/support/log.h +0 -18
  7. data/include/grpc/support/metrics.h +14 -3
  8. data/include/grpc/support/port_platform.h +22 -0
  9. data/src/core/client_channel/client_channel.cc +125 -30
  10. data/src/core/client_channel/client_channel_filter.cc +37 -113
  11. data/src/core/client_channel/client_channel_internal.h +6 -0
  12. data/src/core/client_channel/config_selector.h +17 -14
  13. data/src/core/client_channel/direct_channel.cc +83 -0
  14. data/src/core/client_channel/direct_channel.h +101 -0
  15. data/src/core/client_channel/dynamic_filters.cc +3 -1
  16. data/src/core/client_channel/lb_metadata.cc +120 -0
  17. data/src/core/client_channel/lb_metadata.h +56 -0
  18. data/src/core/client_channel/load_balanced_call_destination.cc +8 -70
  19. data/src/core/client_channel/retry_filter.cc +1 -1
  20. data/src/core/client_channel/retry_filter_legacy_call_data.cc +164 -185
  21. data/src/core/client_channel/subchannel.cc +58 -42
  22. data/src/core/client_channel/subchannel.h +4 -10
  23. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +6 -7
  24. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +2 -0
  25. data/src/core/ext/filters/census/grpc_context.cc +4 -4
  26. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +13 -14
  27. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +4 -0
  28. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +4 -5
  29. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +2 -0
  30. data/src/core/ext/filters/http/client/http_client_filter.cc +1 -1
  31. data/src/core/ext/filters/http/client/http_client_filter.h +2 -0
  32. data/src/core/ext/filters/http/client_authority_filter.cc +1 -2
  33. data/src/core/ext/filters/http/client_authority_filter.h +2 -0
  34. data/src/core/ext/filters/http/message_compress/compression_filter.cc +16 -19
  35. data/src/core/ext/filters/http/message_compress/compression_filter.h +5 -0
  36. data/src/core/ext/filters/http/server/http_server_filter.cc +4 -4
  37. data/src/core/ext/filters/http/server/http_server_filter.h +2 -0
  38. data/src/core/ext/filters/message_size/message_size_filter.cc +12 -14
  39. data/src/core/ext/filters/message_size/message_size_filter.h +4 -0
  40. data/src/core/ext/filters/rbac/rbac_filter.cc +1 -1
  41. data/src/core/ext/filters/rbac/rbac_filter.h +2 -0
  42. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +1 -2
  43. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +2 -0
  44. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +53 -66
  45. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +1 -1
  46. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +90 -112
  47. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +17 -29
  48. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +189 -168
  49. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +2 -2
  50. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  51. data/src/core/ext/transport/chttp2/transport/frame_data.cc +3 -7
  52. data/src/core/ext/transport/chttp2/transport/frame_data.h +2 -1
  53. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +7 -8
  54. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +12 -10
  55. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +5 -3
  56. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +9 -10
  57. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +7 -3
  58. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +3 -1
  59. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +4 -5
  60. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -5
  61. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +47 -38
  62. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -0
  63. data/src/core/ext/transport/chttp2/transport/internal.h +54 -9
  64. data/src/core/ext/transport/chttp2/transport/parsing.cc +59 -59
  65. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +7 -7
  66. data/src/core/ext/transport/chttp2/transport/writing.cc +105 -79
  67. data/src/core/ext/transport/inproc/inproc_transport.cc +94 -35
  68. data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +101 -98
  69. data/src/core/ext/upb-gen/envoy/admin/v3/certs.upb.h +11 -11
  70. data/src/core/ext/upb-gen/envoy/admin/v3/certs.upb_minitable.c +15 -0
  71. data/src/core/ext/upb-gen/envoy/admin/v3/clusters.upb.h +23 -23
  72. data/src/core/ext/upb-gen/envoy/admin/v3/clusters.upb_minitable.c +12 -0
  73. data/src/core/ext/upb-gen/envoy/admin/v3/config_dump.upb.h +11 -11
  74. data/src/core/ext/upb-gen/envoy/admin/v3/config_dump.upb_minitable.c +15 -0
  75. data/src/core/ext/upb-gen/envoy/admin/v3/config_dump_shared.upb.h +50 -50
  76. data/src/core/ext/upb-gen/envoy/admin/v3/config_dump_shared.upb_minitable.c +57 -0
  77. data/src/core/ext/upb-gen/envoy/admin/v3/init_dump.upb.h +1 -1
  78. data/src/core/ext/upb-gen/envoy/admin/v3/init_dump.upb_minitable.c +6 -0
  79. data/src/core/ext/upb-gen/envoy/admin/v3/listeners.upb.h +2 -2
  80. data/src/core/ext/upb-gen/envoy/admin/v3/listeners.upb_minitable.c +6 -0
  81. data/src/core/ext/upb-gen/envoy/admin/v3/memory.upb.h +6 -6
  82. data/src/core/ext/upb-gen/envoy/admin/v3/memory.upb_minitable.c +3 -0
  83. data/src/core/ext/upb-gen/envoy/admin/v3/metrics.upb.h +3 -3
  84. data/src/core/ext/upb-gen/envoy/admin/v3/metrics.upb_minitable.c +3 -0
  85. data/src/core/ext/upb-gen/envoy/admin/v3/mutex_stats.upb.h +3 -3
  86. data/src/core/ext/upb-gen/envoy/admin/v3/mutex_stats.upb_minitable.c +3 -0
  87. data/src/core/ext/upb-gen/envoy/admin/v3/server_info.upb.h +110 -78
  88. data/src/core/ext/upb-gen/envoy/admin/v3/server_info.upb_minitable.c +23 -15
  89. data/src/core/ext/upb-gen/envoy/admin/v3/tap.upb.h +2 -2
  90. data/src/core/ext/upb-gen/envoy/admin/v3/tap.upb_minitable.c +3 -0
  91. data/src/core/ext/upb-gen/envoy/annotations/deprecation.upb.h +4 -4
  92. data/src/core/ext/upb-gen/envoy/annotations/resource.upb.h +11 -2
  93. data/src/core/ext/upb-gen/envoy/annotations/resource.upb_minitable.c +3 -0
  94. data/src/core/ext/upb-gen/envoy/config/accesslog/v3/accesslog.upb.h +30 -30
  95. data/src/core/ext/upb-gen/envoy/config/accesslog/v3/accesslog.upb_minitable.c +48 -0
  96. data/src/core/ext/upb-gen/envoy/config/bootstrap/v3/bootstrap.upb.h +361 -250
  97. data/src/core/ext/upb-gen/envoy/config/bootstrap/v3/bootstrap.upb_minitable.c +139 -48
  98. data/src/core/ext/upb-gen/envoy/config/bootstrap/v3/bootstrap.upb_minitable.h +1 -0
  99. data/src/core/ext/upb-gen/envoy/config/cluster/v3/circuit_breaker.upb.h +10 -10
  100. data/src/core/ext/upb-gen/envoy/config/cluster/v3/circuit_breaker.upb_minitable.c +9 -0
  101. data/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb.h +314 -137
  102. data/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb_minitable.c +120 -22
  103. data/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb_minitable.h +1 -0
  104. data/src/core/ext/upb-gen/envoy/config/cluster/v3/filter.upb.h +3 -3
  105. data/src/core/ext/upb-gen/envoy/config/cluster/v3/filter.upb_minitable.c +3 -0
  106. data/src/core/ext/upb-gen/envoy/config/cluster/v3/outlier_detection.upb.h +115 -23
  107. data/src/core/ext/upb-gen/envoy/config/cluster/v3/outlier_detection.upb_minitable.c +27 -3
  108. data/src/core/ext/upb-gen/envoy/config/common/matcher/v3/matcher.upb.h +31 -31
  109. data/src/core/ext/upb-gen/envoy/config/common/matcher/v3/matcher.upb_minitable.c +45 -0
  110. data/src/core/ext/upb-gen/envoy/config/core/v3/address.upb.h +23 -23
  111. data/src/core/ext/upb-gen/envoy/config/core/v3/address.upb_minitable.c +24 -0
  112. data/src/core/ext/upb-gen/envoy/config/core/v3/backoff.upb.h +2 -2
  113. data/src/core/ext/upb-gen/envoy/config/core/v3/backoff.upb_minitable.c +3 -0
  114. data/src/core/ext/upb-gen/envoy/config/core/v3/base.upb.h +646 -68
  115. data/src/core/ext/upb-gen/envoy/config/core/v3/base.upb_minitable.c +230 -16
  116. data/src/core/ext/upb-gen/envoy/config/core/v3/base.upb_minitable.h +5 -0
  117. data/src/core/ext/upb-gen/envoy/config/core/v3/config_source.upb.h +21 -21
  118. data/src/core/ext/upb-gen/envoy/config/core/v3/config_source.upb_minitable.c +21 -0
  119. data/src/core/ext/upb-gen/envoy/config/core/v3/event_service_config.upb.h +1 -1
  120. data/src/core/ext/upb-gen/envoy/config/core/v3/event_service_config.upb_minitable.c +3 -0
  121. data/src/core/ext/upb-gen/envoy/config/core/v3/extension.upb.h +2 -2
  122. data/src/core/ext/upb-gen/envoy/config/core/v3/extension.upb_minitable.c +3 -0
  123. data/src/core/ext/upb-gen/envoy/config/core/v3/grpc_method_list.upb.h +1 -1
  124. data/src/core/ext/upb-gen/envoy/config/core/v3/grpc_method_list.upb_minitable.c +6 -0
  125. data/src/core/ext/upb-gen/envoy/config/core/v3/grpc_service.upb.h +130 -58
  126. data/src/core/ext/upb-gen/envoy/config/core/v3/grpc_service.upb_minitable.c +63 -12
  127. data/src/core/ext/upb-gen/envoy/config/core/v3/health_check.upb.h +104 -58
  128. data/src/core/ext/upb-gen/envoy/config/core/v3/health_check.upb_minitable.c +42 -11
  129. data/src/core/ext/upb-gen/envoy/config/core/v3/http_service.upb.h +1 -1
  130. data/src/core/ext/upb-gen/envoy/config/core/v3/http_service.upb_minitable.c +3 -0
  131. data/src/core/ext/upb-gen/envoy/config/core/v3/http_uri.upb.h +3 -3
  132. data/src/core/ext/upb-gen/envoy/config/core/v3/http_uri.upb_minitable.c +3 -0
  133. data/src/core/ext/upb-gen/envoy/config/core/v3/protocol.upb.h +132 -72
  134. data/src/core/ext/upb-gen/envoy/config/core/v3/protocol.upb_minitable.c +65 -11
  135. data/src/core/ext/upb-gen/envoy/config/core/v3/proxy_protocol.upb.h +3 -3
  136. data/src/core/ext/upb-gen/envoy/config/core/v3/proxy_protocol.upb_minitable.c +6 -0
  137. data/src/core/ext/upb-gen/envoy/config/core/v3/resolver.upb.h +3 -3
  138. data/src/core/ext/upb-gen/envoy/config/core/v3/resolver.upb_minitable.c +6 -0
  139. data/src/core/ext/upb-gen/envoy/config/core/v3/socket_option.upb.h +6 -6
  140. data/src/core/ext/upb-gen/envoy/config/core/v3/socket_option.upb_minitable.c +6 -0
  141. data/src/core/ext/upb-gen/envoy/config/core/v3/substitution_format_string.upb.h +7 -7
  142. data/src/core/ext/upb-gen/envoy/config/core/v3/substitution_format_string.upb_minitable.c +6 -0
  143. data/src/core/ext/upb-gen/envoy/config/core/v3/udp_socket_config.upb.h +2 -2
  144. data/src/core/ext/upb-gen/envoy/config/core/v3/udp_socket_config.upb_minitable.c +3 -0
  145. data/src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint.upb.h +7 -7
  146. data/src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint.upb_minitable.c +12 -0
  147. data/src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint_components.upb.h +58 -30
  148. data/src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint_components.upb_minitable.c +30 -7
  149. data/src/core/ext/upb-gen/envoy/config/endpoint/v3/load_report.upb.h +237 -33
  150. data/src/core/ext/upb-gen/envoy/config/endpoint/v3/load_report.upb_minitable.c +58 -12
  151. data/src/core/ext/upb-gen/envoy/config/endpoint/v3/load_report.upb_minitable.h +1 -0
  152. data/src/core/ext/upb-gen/envoy/config/listener/v3/api_listener.upb.h +1 -1
  153. data/src/core/ext/upb-gen/envoy/config/listener/v3/api_listener.upb_minitable.c +3 -0
  154. data/src/core/ext/upb-gen/envoy/config/listener/v3/listener.upb.h +59 -43
  155. data/src/core/ext/upb-gen/envoy/config/listener/v3/listener.upb_minitable.c +37 -6
  156. data/src/core/ext/upb-gen/envoy/config/listener/v3/listener_components.upb.h +25 -25
  157. data/src/core/ext/upb-gen/envoy/config/listener/v3/listener_components.upb_minitable.c +21 -0
  158. data/src/core/ext/upb-gen/envoy/config/listener/v3/quic_config.upb.h +66 -9
  159. data/src/core/ext/upb-gen/envoy/config/listener/v3/quic_config.upb_minitable.c +10 -3
  160. data/src/core/ext/upb-gen/envoy/config/listener/v3/udp_listener_config.upb.h +3 -3
  161. data/src/core/ext/upb-gen/envoy/config/listener/v3/udp_listener_config.upb_minitable.c +6 -0
  162. data/src/core/ext/upb-gen/envoy/config/metrics/v3/metrics_service.upb.h +5 -5
  163. data/src/core/ext/upb-gen/envoy/config/metrics/v3/metrics_service.upb_minitable.c +3 -0
  164. data/src/core/ext/upb-gen/envoy/config/metrics/v3/stats.upb.h +18 -18
  165. data/src/core/ext/upb-gen/envoy/config/metrics/v3/stats.upb_minitable.c +24 -0
  166. data/src/core/ext/upb-gen/envoy/config/overload/v3/overload.upb.h +17 -17
  167. data/src/core/ext/upb-gen/envoy/config/overload/v3/overload.upb_minitable.c +30 -0
  168. data/src/core/ext/upb-gen/envoy/config/rbac/v3/rbac.upb.h +63 -34
  169. data/src/core/ext/upb-gen/envoy/config/rbac/v3/rbac.upb_minitable.c +39 -4
  170. data/src/core/ext/upb-gen/envoy/config/route/v3/route.upb.h +9 -9
  171. data/src/core/ext/upb-gen/envoy/config/route/v3/route.upb_minitable.c +9 -0
  172. data/src/core/ext/upb-gen/envoy/config/route/v3/route_components.upb.h +273 -229
  173. data/src/core/ext/upb-gen/envoy/config/route/v3/route_components.upb_minitable.c +191 -14
  174. data/src/core/ext/upb-gen/envoy/config/route/v3/scoped_route.upb.h +6 -6
  175. data/src/core/ext/upb-gen/envoy/config/route/v3/scoped_route.upb_minitable.c +9 -0
  176. data/src/core/ext/upb-gen/envoy/config/tap/v3/common.upb.h +31 -31
  177. data/src/core/ext/upb-gen/envoy/config/tap/v3/common.upb_minitable.c +36 -0
  178. data/src/core/ext/upb-gen/envoy/config/trace/v3/datadog.upb.h +109 -12
  179. data/src/core/ext/upb-gen/envoy/config/trace/v3/datadog.upb_minitable.c +38 -11
  180. data/src/core/ext/upb-gen/envoy/config/trace/v3/datadog.upb_minitable.h +1 -0
  181. data/src/core/ext/upb-gen/envoy/config/trace/v3/dynamic_ot.upb.h +2 -2
  182. data/src/core/ext/upb-gen/envoy/config/trace/v3/dynamic_ot.upb_minitable.c +3 -0
  183. data/src/core/ext/upb-gen/envoy/config/trace/v3/http_tracer.upb.h +3 -3
  184. data/src/core/ext/upb-gen/envoy/config/trace/v3/http_tracer.upb_minitable.c +6 -0
  185. data/src/core/ext/upb-gen/envoy/config/trace/v3/lightstep.upb.h +3 -3
  186. data/src/core/ext/upb-gen/envoy/config/trace/v3/lightstep.upb_minitable.c +3 -0
  187. data/src/core/ext/upb-gen/envoy/config/trace/v3/opencensus.upb.h +11 -11
  188. data/src/core/ext/upb-gen/envoy/config/trace/v3/opencensus.upb_minitable.c +3 -0
  189. data/src/core/ext/upb-gen/envoy/config/trace/v3/opentelemetry.upb.h +4 -4
  190. data/src/core/ext/upb-gen/envoy/config/trace/v3/opentelemetry.upb_minitable.c +3 -0
  191. data/src/core/ext/upb-gen/envoy/config/trace/v3/service.upb.h +1 -1
  192. data/src/core/ext/upb-gen/envoy/config/trace/v3/service.upb_minitable.c +3 -0
  193. data/src/core/ext/upb-gen/envoy/config/trace/v3/skywalking.upb.h +6 -6
  194. data/src/core/ext/upb-gen/envoy/config/trace/v3/skywalking.upb_minitable.c +6 -0
  195. data/src/core/ext/upb-gen/envoy/config/trace/v3/xray.upb.h +6 -6
  196. data/src/core/ext/upb-gen/envoy/config/trace/v3/xray.upb_minitable.c +6 -0
  197. data/src/core/ext/upb-gen/envoy/config/trace/v3/zipkin.upb.h +7 -7
  198. data/src/core/ext/upb-gen/envoy/config/trace/v3/zipkin.upb_minitable.c +3 -0
  199. data/src/core/ext/upb-gen/envoy/data/accesslog/v3/accesslog.upb.h +114 -98
  200. data/src/core/ext/upb-gen/envoy/data/accesslog/v3/accesslog.upb_minitable.c +52 -3
  201. data/src/core/ext/upb-gen/envoy/extensions/clusters/aggregate/v3/cluster.upb_minitable.c +3 -0
  202. data/src/core/ext/upb-gen/envoy/extensions/filters/common/fault/v3/fault.upb.h +7 -7
  203. data/src/core/ext/upb-gen/envoy/extensions/filters/common/fault/v3/fault.upb_minitable.c +15 -0
  204. data/src/core/ext/upb-gen/envoy/extensions/filters/http/fault/v3/fault.upb.h +18 -18
  205. data/src/core/ext/upb-gen/envoy/extensions/filters/http/fault/v3/fault.upb_minitable.c +9 -0
  206. data/src/core/ext/upb-gen/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +41 -9
  207. data/src/core/ext/upb-gen/envoy/extensions/filters/http/rbac/v3/rbac.upb_minitable.c +15 -3
  208. data/src/core/ext/upb-gen/envoy/extensions/filters/http/router/v3/router.upb.h +8 -8
  209. data/src/core/ext/upb-gen/envoy/extensions/filters/http/router/v3/router.upb_minitable.c +6 -0
  210. data/src/core/ext/upb-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h +4 -4
  211. data/src/core/ext/upb-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb_minitable.c +6 -0
  212. data/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +146 -130
  213. data/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb_minitable.c +74 -10
  214. data/src/core/ext/upb-gen/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.h +1 -1
  215. data/src/core/ext/upb-gen/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb_minitable.c +3 -0
  216. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.h +6 -6
  217. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb_minitable.c +3 -0
  218. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/common/v3/common.upb.h +10 -10
  219. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/common/v3/common.upb_minitable.c +15 -0
  220. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/pick_first/v3/pick_first.upb.h +1 -1
  221. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/pick_first/v3/pick_first.upb_minitable.c +3 -0
  222. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +7 -7
  223. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb_minitable.c +3 -0
  224. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +1 -1
  225. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb_minitable.c +3 -0
  226. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/common.upb.h +111 -27
  227. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/common.upb_minitable.c +43 -7
  228. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/common.upb_minitable.h +1 -0
  229. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +8 -8
  230. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/secret.upb_minitable.c +9 -0
  231. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +35 -35
  232. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/tls.upb_minitable.c +21 -0
  233. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.h +2 -2
  234. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb_minitable.c +6 -0
  235. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +16 -16
  236. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +12 -0
  237. data/src/core/ext/upb-gen/envoy/service/discovery/v3/ads.upb_minitable.c +3 -0
  238. data/src/core/ext/upb-gen/envoy/service/discovery/v3/discovery.upb.h +36 -36
  239. data/src/core/ext/upb-gen/envoy/service/discovery/v3/discovery.upb_minitable.c +42 -0
  240. data/src/core/ext/upb-gen/envoy/service/load_stats/v3/lrs.upb.h +4 -4
  241. data/src/core/ext/upb-gen/envoy/service/load_stats/v3/lrs.upb_minitable.c +6 -0
  242. data/src/core/ext/upb-gen/envoy/service/status/v3/csds.upb.h +20 -20
  243. data/src/core/ext/upb-gen/envoy/service/status/v3/csds.upb_minitable.c +15 -0
  244. data/src/core/ext/upb-gen/envoy/type/http/v3/cookie.upb.h +3 -3
  245. data/src/core/ext/upb-gen/envoy/type/http/v3/cookie.upb_minitable.c +3 -0
  246. data/src/core/ext/upb-gen/envoy/type/http/v3/path_transformation.upb.h +2 -2
  247. data/src/core/ext/upb-gen/envoy/type/http/v3/path_transformation.upb_minitable.c +12 -0
  248. data/src/core/ext/upb-gen/envoy/type/matcher/v3/filter_state.upb.h +2 -2
  249. data/src/core/ext/upb-gen/envoy/type/matcher/v3/filter_state.upb_minitable.c +3 -0
  250. data/src/core/ext/upb-gen/envoy/type/matcher/v3/http_inputs.upb.h +5 -5
  251. data/src/core/ext/upb-gen/envoy/type/matcher/v3/http_inputs.upb_minitable.c +15 -0
  252. data/src/core/ext/upb-gen/envoy/type/matcher/v3/metadata.upb.h +4 -4
  253. data/src/core/ext/upb-gen/envoy/type/matcher/v3/metadata.upb_minitable.c +6 -0
  254. data/src/core/ext/upb-gen/envoy/type/matcher/v3/node.upb.h +1 -1
  255. data/src/core/ext/upb-gen/envoy/type/matcher/v3/node.upb_minitable.c +3 -0
  256. data/src/core/ext/upb-gen/envoy/type/matcher/v3/number.upb.h +2 -2
  257. data/src/core/ext/upb-gen/envoy/type/matcher/v3/number.upb_minitable.c +3 -0
  258. data/src/core/ext/upb-gen/envoy/type/matcher/v3/path.upb.h +1 -1
  259. data/src/core/ext/upb-gen/envoy/type/matcher/v3/path.upb_minitable.c +3 -0
  260. data/src/core/ext/upb-gen/envoy/type/matcher/v3/regex.upb.h +5 -5
  261. data/src/core/ext/upb-gen/envoy/type/matcher/v3/regex.upb_minitable.c +9 -0
  262. data/src/core/ext/upb-gen/envoy/type/matcher/v3/status_code_input.upb_minitable.c +6 -0
  263. data/src/core/ext/upb-gen/envoy/type/matcher/v3/string.upb.h +37 -6
  264. data/src/core/ext/upb-gen/envoy/type/matcher/v3/string.upb_minitable.c +20 -3
  265. data/src/core/ext/upb-gen/envoy/type/matcher/v3/struct.upb.h +2 -2
  266. data/src/core/ext/upb-gen/envoy/type/matcher/v3/struct.upb_minitable.c +6 -0
  267. data/src/core/ext/upb-gen/envoy/type/matcher/v3/value.upb.h +8 -8
  268. data/src/core/ext/upb-gen/envoy/type/matcher/v3/value.upb_minitable.c +12 -0
  269. data/src/core/ext/upb-gen/envoy/type/metadata/v3/metadata.upb.h +6 -6
  270. data/src/core/ext/upb-gen/envoy/type/metadata/v3/metadata.upb_minitable.c +21 -0
  271. data/src/core/ext/upb-gen/envoy/type/tracing/v3/custom_tag.upb.h +13 -13
  272. data/src/core/ext/upb-gen/envoy/type/tracing/v3/custom_tag.upb_minitable.c +15 -0
  273. data/src/core/ext/upb-gen/envoy/type/v3/hash_policy.upb.h +3 -3
  274. data/src/core/ext/upb-gen/envoy/type/v3/hash_policy.upb_minitable.c +9 -0
  275. data/src/core/ext/upb-gen/envoy/type/v3/http_status.upb.h +1 -1
  276. data/src/core/ext/upb-gen/envoy/type/v3/http_status.upb_minitable.c +3 -0
  277. data/src/core/ext/upb-gen/envoy/type/v3/percent.upb.h +3 -3
  278. data/src/core/ext/upb-gen/envoy/type/v3/percent.upb_minitable.c +6 -0
  279. data/src/core/ext/upb-gen/envoy/type/v3/range.upb.h +6 -6
  280. data/src/core/ext/upb-gen/envoy/type/v3/range.upb_minitable.c +9 -0
  281. data/src/core/ext/upb-gen/envoy/type/v3/ratelimit_strategy.upb.h +5 -5
  282. data/src/core/ext/upb-gen/envoy/type/v3/ratelimit_strategy.upb_minitable.c +6 -0
  283. data/src/core/ext/upb-gen/envoy/type/v3/semantic_version.upb.h +3 -3
  284. data/src/core/ext/upb-gen/envoy/type/v3/semantic_version.upb_minitable.c +3 -0
  285. data/src/core/ext/upb-gen/envoy/type/v3/token_bucket.upb.h +3 -3
  286. data/src/core/ext/upb-gen/envoy/type/v3/token_bucket.upb_minitable.c +3 -0
  287. data/src/core/ext/upb-gen/google/api/annotations.upb.h +10 -1
  288. data/src/core/ext/upb-gen/google/api/expr/v1alpha1/checked.upb.h +32 -32
  289. data/src/core/ext/upb-gen/google/api/expr/v1alpha1/checked.upb_minitable.c +39 -0
  290. data/src/core/ext/upb-gen/google/api/expr/v1alpha1/syntax.upb.h +43 -43
  291. data/src/core/ext/upb-gen/google/api/expr/v1alpha1/syntax.upb_minitable.c +42 -0
  292. data/src/core/ext/upb-gen/google/api/http.upb.h +12 -12
  293. data/src/core/ext/upb-gen/google/api/http.upb_minitable.c +9 -0
  294. data/src/core/ext/upb-gen/google/api/httpbody.upb.h +2 -2
  295. data/src/core/ext/upb-gen/google/api/httpbody.upb_minitable.c +3 -0
  296. data/src/core/ext/upb-gen/google/protobuf/any.upb.h +2 -2
  297. data/src/core/ext/upb-gen/google/protobuf/any.upb_minitable.c +3 -0
  298. data/src/core/ext/upb-gen/google/protobuf/descriptor.upb.h +381 -177
  299. data/src/core/ext/upb-gen/google/protobuf/descriptor.upb_minitable.c +148 -22
  300. data/src/core/ext/upb-gen/google/protobuf/descriptor.upb_minitable.h +1 -0
  301. data/src/core/ext/upb-gen/google/protobuf/duration.upb.h +2 -2
  302. data/src/core/ext/upb-gen/google/protobuf/duration.upb_minitable.c +3 -0
  303. data/src/core/ext/upb-gen/google/protobuf/empty.upb_minitable.c +3 -0
  304. data/src/core/ext/upb-gen/google/protobuf/struct.upb.h +6 -6
  305. data/src/core/ext/upb-gen/google/protobuf/struct.upb_minitable.c +12 -0
  306. data/src/core/ext/upb-gen/google/protobuf/timestamp.upb.h +2 -2
  307. data/src/core/ext/upb-gen/google/protobuf/timestamp.upb_minitable.c +3 -0
  308. data/src/core/ext/upb-gen/google/protobuf/wrappers.upb.h +9 -9
  309. data/src/core/ext/upb-gen/google/protobuf/wrappers.upb_minitable.c +27 -0
  310. data/src/core/ext/upb-gen/google/rpc/status.upb.h +2 -2
  311. data/src/core/ext/upb-gen/google/rpc/status.upb_minitable.c +3 -0
  312. data/src/core/ext/upb-gen/opencensus/proto/trace/v1/trace_config.upb.h +10 -10
  313. data/src/core/ext/upb-gen/opencensus/proto/trace/v1/trace_config.upb_minitable.c +12 -0
  314. data/src/core/ext/upb-gen/src/proto/grpc/gcp/altscontext.upb.h +6 -6
  315. data/src/core/ext/upb-gen/src/proto/grpc/gcp/altscontext.upb_minitable.c +6 -0
  316. data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb.h +35 -35
  317. data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb_minitable.c +36 -0
  318. data/src/core/ext/upb-gen/src/proto/grpc/gcp/transport_security_common.upb.h +4 -4
  319. data/src/core/ext/upb-gen/src/proto/grpc/gcp/transport_security_common.upb_minitable.c +6 -0
  320. data/src/core/ext/upb-gen/src/proto/grpc/health/v1/health.upb.h +2 -2
  321. data/src/core/ext/upb-gen/src/proto/grpc/health/v1/health.upb_minitable.c +6 -0
  322. data/src/core/ext/upb-gen/src/proto/grpc/lb/v1/load_balancer.upb.h +18 -18
  323. data/src/core/ext/upb-gen/src/proto/grpc/lb/v1/load_balancer.upb_minitable.c +27 -0
  324. data/src/core/ext/upb-gen/src/proto/grpc/lookup/v1/rls.upb.h +4 -4
  325. data/src/core/ext/upb-gen/src/proto/grpc/lookup/v1/rls.upb_minitable.c +9 -0
  326. data/src/core/ext/upb-gen/src/proto/grpc/lookup/v1/rls_config.upb.h +15 -15
  327. data/src/core/ext/upb-gen/src/proto/grpc/lookup/v1/rls_config.upb_minitable.c +27 -0
  328. data/src/core/ext/upb-gen/udpa/annotations/migrate.upb.h +54 -9
  329. data/src/core/ext/upb-gen/udpa/annotations/migrate.upb_minitable.c +9 -0
  330. data/src/core/ext/upb-gen/udpa/annotations/security.upb.h +12 -3
  331. data/src/core/ext/upb-gen/udpa/annotations/security.upb_minitable.c +3 -0
  332. data/src/core/ext/upb-gen/udpa/annotations/sensitive.upb.h +1 -1
  333. data/src/core/ext/upb-gen/udpa/annotations/status.upb.h +12 -3
  334. data/src/core/ext/upb-gen/udpa/annotations/status.upb_minitable.c +3 -0
  335. data/src/core/ext/upb-gen/udpa/annotations/versioning.upb.h +11 -2
  336. data/src/core/ext/upb-gen/udpa/annotations/versioning.upb_minitable.c +3 -0
  337. data/src/core/ext/upb-gen/validate/validate.upb.h +175 -166
  338. data/src/core/ext/upb-gen/validate/validate.upb_minitable.c +69 -0
  339. data/src/core/ext/upb-gen/xds/annotations/v3/migrate.upb.h +54 -9
  340. data/src/core/ext/upb-gen/xds/annotations/v3/migrate.upb_minitable.c +9 -0
  341. data/src/core/ext/upb-gen/xds/annotations/v3/security.upb.h +12 -3
  342. data/src/core/ext/upb-gen/xds/annotations/v3/security.upb_minitable.c +3 -0
  343. data/src/core/ext/upb-gen/xds/annotations/v3/sensitive.upb.h +1 -1
  344. data/src/core/ext/upb-gen/xds/annotations/v3/status.upb.h +35 -8
  345. data/src/core/ext/upb-gen/xds/annotations/v3/status.upb_minitable.c +12 -0
  346. data/src/core/ext/upb-gen/xds/annotations/v3/versioning.upb.h +11 -2
  347. data/src/core/ext/upb-gen/xds/annotations/v3/versioning.upb_minitable.c +3 -0
  348. data/src/core/ext/upb-gen/xds/core/v3/authority.upb.h +1 -1
  349. data/src/core/ext/upb-gen/xds/core/v3/authority.upb_minitable.c +3 -0
  350. data/src/core/ext/upb-gen/xds/core/v3/cidr.upb.h +2 -2
  351. data/src/core/ext/upb-gen/xds/core/v3/cidr.upb_minitable.c +3 -0
  352. data/src/core/ext/upb-gen/xds/core/v3/collection_entry.upb.h +5 -5
  353. data/src/core/ext/upb-gen/xds/core/v3/collection_entry.upb_minitable.c +6 -0
  354. data/src/core/ext/upb-gen/xds/core/v3/context_params.upb_minitable.c +6 -0
  355. data/src/core/ext/upb-gen/xds/core/v3/extension.upb.h +2 -2
  356. data/src/core/ext/upb-gen/xds/core/v3/extension.upb_minitable.c +3 -0
  357. data/src/core/ext/upb-gen/xds/core/v3/resource.upb.h +3 -3
  358. data/src/core/ext/upb-gen/xds/core/v3/resource.upb_minitable.c +3 -0
  359. data/src/core/ext/upb-gen/xds/core/v3/resource_locator.upb.h +7 -7
  360. data/src/core/ext/upb-gen/xds/core/v3/resource_locator.upb_minitable.c +6 -0
  361. data/src/core/ext/upb-gen/xds/core/v3/resource_name.upb.h +4 -4
  362. data/src/core/ext/upb-gen/xds/core/v3/resource_name.upb_minitable.c +3 -0
  363. data/src/core/ext/upb-gen/xds/data/orca/v3/orca_load_report.upb.h +6 -6
  364. data/src/core/ext/upb-gen/xds/data/orca/v3/orca_load_report.upb_minitable.c +12 -0
  365. data/src/core/ext/upb-gen/xds/service/orca/v3/orca.upb.h +1 -1
  366. data/src/core/ext/upb-gen/xds/service/orca/v3/orca.upb_minitable.c +3 -0
  367. data/src/core/ext/upb-gen/xds/type/matcher/v3/cel.upb.h +2 -2
  368. data/src/core/ext/upb-gen/xds/type/matcher/v3/cel.upb_minitable.c +3 -0
  369. data/src/core/ext/upb-gen/xds/type/matcher/v3/domain.upb.h +1 -1
  370. data/src/core/ext/upb-gen/xds/type/matcher/v3/domain.upb_minitable.c +6 -0
  371. data/src/core/ext/upb-gen/xds/type/matcher/v3/http_inputs.upb_minitable.c +3 -0
  372. data/src/core/ext/upb-gen/xds/type/matcher/v3/ip.upb.h +2 -2
  373. data/src/core/ext/upb-gen/xds/type/matcher/v3/ip.upb_minitable.c +6 -0
  374. data/src/core/ext/upb-gen/xds/type/matcher/v3/matcher.upb.h +18 -18
  375. data/src/core/ext/upb-gen/xds/type/matcher/v3/matcher.upb_minitable.c +30 -0
  376. data/src/core/ext/upb-gen/xds/type/matcher/v3/range.upb.h +3 -3
  377. data/src/core/ext/upb-gen/xds/type/matcher/v3/range.upb_minitable.c +18 -0
  378. data/src/core/ext/upb-gen/xds/type/matcher/v3/regex.upb.h +2 -2
  379. data/src/core/ext/upb-gen/xds/type/matcher/v3/regex.upb_minitable.c +6 -0
  380. data/src/core/ext/upb-gen/xds/type/matcher/v3/string.upb.h +6 -6
  381. data/src/core/ext/upb-gen/xds/type/matcher/v3/string.upb_minitable.c +6 -0
  382. data/src/core/ext/upb-gen/xds/type/v3/cel.upb.h +4 -4
  383. data/src/core/ext/upb-gen/xds/type/v3/cel.upb_minitable.c +6 -0
  384. data/src/core/ext/upb-gen/xds/type/v3/range.upb.h +6 -6
  385. data/src/core/ext/upb-gen/xds/type/v3/range.upb_minitable.c +9 -0
  386. data/src/core/ext/upb-gen/xds/type/v3/typed_struct.upb.h +2 -2
  387. data/src/core/ext/upb-gen/xds/type/v3/typed_struct.upb_minitable.c +3 -0
  388. data/src/core/ext/upbdefs-gen/envoy/admin/v3/server_info.upbdefs.c +86 -81
  389. data/src/core/ext/upbdefs-gen/envoy/config/accesslog/v3/accesslog.upbdefs.c +61 -60
  390. data/src/core/ext/upbdefs-gen/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +221 -210
  391. data/src/core/ext/upbdefs-gen/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +5 -0
  392. data/src/core/ext/upbdefs-gen/envoy/config/cluster/v3/cluster.upbdefs.c +317 -297
  393. data/src/core/ext/upbdefs-gen/envoy/config/cluster/v3/cluster.upbdefs.h +5 -0
  394. data/src/core/ext/upbdefs-gen/envoy/config/cluster/v3/outlier_detection.upbdefs.c +114 -105
  395. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/base.upbdefs.c +185 -140
  396. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/base.upbdefs.h +25 -0
  397. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/config_source.upbdefs.c +10 -11
  398. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/grpc_service.upbdefs.c +173 -164
  399. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/health_check.upbdefs.c +197 -187
  400. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/protocol.upbdefs.c +229 -222
  401. data/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +39 -36
  402. data/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/load_report.upbdefs.c +122 -93
  403. data/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/load_report.upbdefs.h +5 -0
  404. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/listener.upbdefs.c +41 -39
  405. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/quic_config.upbdefs.c +20 -12
  406. data/src/core/ext/upbdefs-gen/envoy/config/rbac/v3/rbac.upbdefs.c +69 -65
  407. data/src/core/ext/upbdefs-gen/envoy/config/route/v3/route_components.upbdefs.c +611 -604
  408. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/datadog.upbdefs.c +30 -20
  409. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/datadog.upbdefs.h +5 -0
  410. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/dynamic_ot.upbdefs.c +18 -17
  411. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/opencensus.upbdefs.c +62 -59
  412. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/zipkin.upbdefs.c +21 -20
  413. data/src/core/ext/upbdefs-gen/envoy/data/accesslog/v3/accesslog.upbdefs.c +145 -142
  414. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +36 -33
  415. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +290 -288
  416. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +82 -75
  417. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h +5 -0
  418. data/src/core/ext/upbdefs-gen/envoy/type/matcher/v3/string.upbdefs.c +39 -33
  419. data/src/core/ext/upbdefs-gen/google/protobuf/descriptor.upbdefs.c +281 -256
  420. data/src/core/ext/upbdefs-gen/google/protobuf/descriptor.upbdefs.h +5 -0
  421. data/src/core/handshaker/endpoint_info/endpoint_info_handshaker.cc +9 -7
  422. data/src/core/handshaker/handshaker.cc +122 -135
  423. data/src/core/handshaker/handshaker.h +51 -43
  424. data/src/core/handshaker/http_connect/http_connect_handshaker.cc +102 -137
  425. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +13 -16
  426. data/src/core/handshaker/security/secure_endpoint.cc +36 -39
  427. data/src/core/handshaker/security/secure_endpoint.h +5 -3
  428. data/src/core/handshaker/security/security_handshaker.cc +95 -119
  429. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +36 -49
  430. data/src/core/lib/channel/channel_args.h +5 -0
  431. data/src/core/lib/channel/channel_stack.cc +3 -8
  432. data/src/core/lib/channel/channel_stack.h +2 -12
  433. data/src/core/lib/channel/connected_channel.cc +2 -2
  434. data/src/core/lib/channel/promise_based_filter.cc +120 -145
  435. data/src/core/lib/channel/promise_based_filter.h +6 -18
  436. data/src/core/lib/compression/compression.cc +3 -3
  437. data/src/core/lib/config/config_vars.cc +1 -8
  438. data/src/core/lib/config/config_vars.h +0 -6
  439. data/src/core/lib/debug/trace.cc +1 -2
  440. data/src/core/lib/debug/trace_flags.cc +2 -0
  441. data/src/core/lib/debug/trace_flags.h +1 -0
  442. data/src/core/lib/debug/trace_impl.h +4 -0
  443. data/src/core/lib/event_engine/ares_resolver.cc +47 -0
  444. data/src/core/lib/event_engine/ares_resolver.h +13 -6
  445. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +10 -11
  446. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +29 -28
  447. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +0 -1
  448. data/src/core/lib/event_engine/default_event_engine.cc +6 -7
  449. data/src/core/lib/event_engine/event_engine.cc +8 -2
  450. data/src/core/lib/event_engine/event_engine_context.h +4 -2
  451. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +32 -30
  452. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +7 -21
  453. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +3 -3
  454. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +17 -10
  455. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +2 -0
  456. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +7 -8
  457. data/src/core/lib/event_engine/thread_pool/thread_count.cc +3 -2
  458. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +10 -12
  459. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.cc +32 -6
  460. data/src/core/lib/event_engine/windows/iocp.cc +10 -9
  461. data/src/core/lib/event_engine/windows/win_socket.cc +14 -12
  462. data/src/core/lib/event_engine/windows/windows_endpoint.cc +10 -8
  463. data/src/core/lib/event_engine/windows/windows_engine.cc +35 -40
  464. data/src/core/lib/event_engine/windows/windows_listener.cc +8 -11
  465. data/src/core/lib/experiments/config.cc +33 -7
  466. data/src/core/lib/experiments/config.h +55 -1
  467. data/src/core/lib/experiments/experiments.cc +15 -51
  468. data/src/core/lib/experiments/experiments.h +33 -49
  469. data/src/core/lib/gprpp/bitset.h +1 -1
  470. data/src/core/lib/gprpp/construct_destruct.h +2 -2
  471. data/src/core/lib/gprpp/debug_location.h +7 -0
  472. data/src/core/lib/gprpp/down_cast.h +2 -2
  473. data/src/core/lib/gprpp/dump_args.cc +8 -8
  474. data/src/core/lib/gprpp/dump_args.h +51 -3
  475. data/src/core/lib/gprpp/status_helper.cc +1 -1
  476. data/src/core/lib/gprpp/table.h +23 -15
  477. data/src/core/lib/gprpp/time.h +12 -17
  478. data/src/core/lib/gprpp/unique_type_name.h +28 -8
  479. data/src/core/lib/gprpp/work_serializer.cc +22 -17
  480. data/src/core/lib/iomgr/call_combiner.cc +28 -44
  481. data/src/core/lib/iomgr/call_combiner.h +7 -5
  482. data/src/core/lib/iomgr/cfstream_handle.cc +10 -10
  483. data/src/core/lib/iomgr/closure.h +5 -5
  484. data/src/core/lib/iomgr/combiner.cc +30 -39
  485. data/src/core/lib/iomgr/endpoint.h +2 -0
  486. data/src/core/lib/iomgr/endpoint_cfstream.cc +21 -25
  487. data/src/core/lib/iomgr/error.cc +3 -3
  488. data/src/core/lib/iomgr/ev_apple.cc +3 -3
  489. data/src/core/lib/iomgr/ev_epoll1_linux.cc +31 -38
  490. data/src/core/lib/iomgr/ev_poll_posix.cc +14 -14
  491. data/src/core/lib/iomgr/ev_posix.cc +5 -4
  492. data/src/core/lib/iomgr/ev_posix.h +3 -3
  493. data/src/core/lib/iomgr/event_engine_shims/closure.cc +6 -6
  494. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +9 -11
  495. data/src/core/lib/iomgr/event_engine_shims/tcp_client.cc +7 -10
  496. data/src/core/lib/iomgr/exec_ctx.cc +6 -6
  497. data/src/core/lib/iomgr/executor.cc +8 -5
  498. data/src/core/lib/iomgr/lockfree_event.cc +6 -9
  499. data/src/core/lib/iomgr/socket_utils_common_posix.cc +13 -13
  500. data/src/core/lib/iomgr/tcp_client_cfstream.cc +8 -7
  501. data/src/core/lib/iomgr/tcp_client_posix.cc +6 -7
  502. data/src/core/lib/iomgr/tcp_posix.cc +30 -34
  503. data/src/core/lib/iomgr/tcp_server_posix.cc +20 -29
  504. data/src/core/lib/iomgr/tcp_windows.cc +8 -12
  505. data/src/core/lib/iomgr/timer_generic.cc +52 -61
  506. data/src/core/lib/iomgr/timer_manager.cc +4 -6
  507. data/src/core/lib/promise/activity.h +13 -2
  508. data/src/core/lib/promise/all_ok.h +15 -8
  509. data/src/core/lib/promise/cancel_callback.h +11 -7
  510. data/src/core/lib/promise/context.h +7 -7
  511. data/src/core/lib/promise/detail/join_state.h +418 -579
  512. data/src/core/lib/promise/detail/promise_factory.h +44 -27
  513. data/src/core/lib/promise/detail/promise_like.h +14 -5
  514. data/src/core/lib/promise/detail/seq_state.h +208 -614
  515. data/src/core/lib/promise/detail/status.h +34 -13
  516. data/src/core/lib/promise/for_each.h +25 -20
  517. data/src/core/lib/promise/if.h +19 -15
  518. data/src/core/lib/promise/interceptor_list.h +12 -13
  519. data/src/core/lib/promise/latch.h +9 -14
  520. data/src/core/lib/promise/loop.h +13 -8
  521. data/src/core/lib/promise/map.h +9 -8
  522. data/src/core/lib/promise/party.cc +81 -62
  523. data/src/core/lib/promise/party.h +68 -89
  524. data/src/core/lib/promise/pipe.h +2 -3
  525. data/src/core/lib/promise/poll.h +99 -33
  526. data/src/core/lib/promise/promise.h +11 -5
  527. data/src/core/lib/promise/race.h +10 -5
  528. data/src/core/lib/promise/seq.h +51 -36
  529. data/src/core/lib/promise/status_flag.h +146 -47
  530. data/src/core/lib/promise/try_join.h +34 -18
  531. data/src/core/lib/promise/try_seq.h +83 -46
  532. data/src/core/lib/resource_quota/arena.cc +19 -17
  533. data/src/core/lib/resource_quota/arena.h +30 -10
  534. data/src/core/lib/resource_quota/memory_quota.cc +14 -15
  535. data/src/core/lib/resource_quota/memory_quota.h +3 -2
  536. data/src/core/lib/resource_quota/periodic_update.cc +3 -2
  537. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +13 -17
  538. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +2 -0
  539. data/src/core/lib/security/context/security_context.cc +31 -28
  540. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +1 -1
  541. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +1 -1
  542. data/src/core/lib/security/credentials/composite/composite_credentials.cc +7 -9
  543. data/src/core/lib/security/credentials/credentials.cc +11 -9
  544. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +2 -3
  545. data/src/core/lib/security/credentials/iam/iam_credentials.cc +3 -5
  546. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  547. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +8 -14
  548. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +19 -23
  549. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +11 -18
  550. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +16 -20
  551. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +5 -6
  552. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +2 -3
  553. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +5 -7
  554. data/src/core/lib/security/credentials/tls/tls_credentials.cc +2 -2
  555. data/src/core/lib/security/credentials/xds/xds_credentials.cc +12 -8
  556. data/src/core/lib/security/security_connector/security_connector.cc +3 -3
  557. data/src/core/lib/security/security_connector/ssl_utils.cc +9 -6
  558. data/src/core/lib/security/transport/auth_filters.h +4 -0
  559. data/src/core/lib/security/transport/client_auth_filter.cc +1 -2
  560. data/src/core/lib/security/transport/server_auth_filter.cc +8 -11
  561. data/src/core/lib/slice/slice_refcount.h +4 -6
  562. data/src/core/lib/surface/call.cc +33 -26
  563. data/src/core/lib/surface/call.h +9 -18
  564. data/src/core/lib/surface/call_details.cc +4 -3
  565. data/src/core/lib/surface/call_log_batch.cc +4 -5
  566. data/src/core/lib/surface/call_utils.cc +5 -7
  567. data/src/core/lib/surface/channel.cc +32 -34
  568. data/src/core/lib/surface/channel_create.cc +15 -6
  569. data/src/core/lib/surface/channel_init.cc +257 -196
  570. data/src/core/lib/surface/channel_init.h +156 -21
  571. data/src/core/lib/surface/client_call.cc +32 -21
  572. data/src/core/lib/surface/client_call.h +12 -12
  573. data/src/core/lib/surface/completion_queue.cc +51 -64
  574. data/src/core/lib/surface/filter_stack_call.cc +15 -14
  575. data/src/core/lib/surface/init.cc +25 -7
  576. data/src/core/lib/surface/lame_client.cc +1 -2
  577. data/src/core/lib/surface/lame_client.h +2 -0
  578. data/src/core/lib/surface/legacy_channel.cc +9 -7
  579. data/src/core/lib/surface/metadata_array.cc +4 -3
  580. data/src/core/lib/surface/server_call.cc +2 -0
  581. data/src/core/lib/surface/server_call.h +8 -6
  582. data/src/core/lib/surface/version.cc +2 -2
  583. data/src/core/lib/transport/bdp_estimator.cc +7 -9
  584. data/src/core/lib/transport/bdp_estimator.h +5 -5
  585. data/src/core/lib/transport/call_arena_allocator.h +2 -0
  586. data/src/core/lib/transport/call_filters.cc +72 -319
  587. data/src/core/lib/transport/call_filters.h +347 -770
  588. data/src/core/lib/transport/call_spine.cc +99 -72
  589. data/src/core/lib/transport/call_spine.h +23 -73
  590. data/src/core/lib/transport/call_state.cc +39 -0
  591. data/src/core/lib/transport/call_state.h +957 -0
  592. data/src/core/lib/transport/connectivity_state.cc +28 -25
  593. data/src/core/lib/transport/interception_chain.cc +6 -14
  594. data/src/core/lib/transport/interception_chain.h +34 -26
  595. data/src/core/lib/transport/metadata.cc +27 -3
  596. data/src/core/lib/transport/metadata.h +37 -2
  597. data/src/core/lib/transport/metadata_batch.h +5 -0
  598. data/src/core/lib/transport/transport.h +9 -5
  599. data/src/core/load_balancing/child_policy_handler.cc +24 -27
  600. data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +1 -2
  601. data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +3 -0
  602. data/src/core/load_balancing/grpclb/grpclb.cc +95 -106
  603. data/src/core/load_balancing/health_check_client.cc +35 -41
  604. data/src/core/load_balancing/lb_policy.h +42 -22
  605. data/src/core/load_balancing/oob_backend_metric.cc +4 -4
  606. data/src/core/load_balancing/outlier_detection/outlier_detection.cc +86 -104
  607. data/src/core/load_balancing/pick_first/pick_first.cc +156 -180
  608. data/src/core/load_balancing/priority/priority.cc +63 -74
  609. data/src/core/load_balancing/ring_hash/ring_hash.cc +34 -40
  610. data/src/core/load_balancing/rls/rls.cc +136 -145
  611. data/src/core/load_balancing/round_robin/round_robin.cc +39 -38
  612. data/src/core/load_balancing/subchannel_interface.h +4 -0
  613. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +75 -74
  614. data/src/core/load_balancing/weighted_target/weighted_target.cc +47 -55
  615. data/src/core/load_balancing/xds/cds.cc +22 -22
  616. data/src/core/load_balancing/xds/xds_cluster_impl.cc +100 -75
  617. data/src/core/load_balancing/xds/xds_cluster_manager.cc +31 -45
  618. data/src/core/load_balancing/xds/xds_override_host.cc +68 -91
  619. data/src/core/load_balancing/xds/xds_wrr_locality.cc +19 -18
  620. data/src/core/resolver/dns/c_ares/dns_resolver_ares.cc +9 -0
  621. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +14 -24
  622. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +6 -6
  623. data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +4 -5
  624. data/src/core/resolver/dns/native/dns_resolver.cc +6 -7
  625. data/src/core/resolver/endpoint_addresses.h +3 -0
  626. data/src/core/resolver/resolver.h +0 -3
  627. data/src/core/resolver/xds/xds_dependency_manager.cc +67 -57
  628. data/src/core/resolver/xds/xds_dependency_manager.h +4 -0
  629. data/src/core/resolver/xds/xds_resolver.cc +72 -45
  630. data/src/core/resolver/xds/xds_resolver_attributes.h +5 -1
  631. data/src/core/server/server.cc +74 -78
  632. data/src/core/server/server_call_tracer_filter.cc +3 -2
  633. data/src/core/server/server_config_selector_filter.cc +6 -2
  634. data/src/core/server/xds_channel_stack_modifier.cc +1 -1
  635. data/src/core/server/xds_server_config_fetcher.cc +40 -44
  636. data/src/core/service_config/service_config_call_data.h +2 -1
  637. data/src/core/service_config/service_config_channel_arg_filter.cc +3 -2
  638. data/src/core/telemetry/call_tracer.cc +34 -0
  639. data/src/core/telemetry/call_tracer.h +15 -0
  640. data/src/core/telemetry/metrics.h +13 -8
  641. data/src/core/tsi/alts/frame_protector/frame_handler.cc +8 -7
  642. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +8 -10
  643. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +6 -9
  644. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +13 -21
  645. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +6 -8
  646. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +6 -8
  647. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +5 -5
  648. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +3 -6
  649. data/src/core/tsi/fake_transport_security.cc +7 -7
  650. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +5 -7
  651. data/src/core/tsi/ssl_transport_security.cc +44 -29
  652. data/src/core/tsi/ssl_transport_security_utils.cc +3 -4
  653. data/src/core/util/android/log.cc +0 -12
  654. data/src/core/util/http_client/httpcli.cc +21 -33
  655. data/src/core/util/http_client/httpcli.h +3 -4
  656. data/src/core/util/http_client/parser.cc +3 -3
  657. data/src/core/util/latent_see.cc +113 -0
  658. data/src/core/util/latent_see.h +214 -0
  659. data/src/core/util/linux/cpu.cc +8 -7
  660. data/src/core/util/log.cc +0 -18
  661. data/src/core/util/posix/cpu.cc +3 -2
  662. data/src/core/util/posix/tmpfile.cc +5 -5
  663. data/src/core/util/time_precise.cc +4 -3
  664. data/src/core/{xds/grpc → util}/upb_utils.h +3 -5
  665. data/src/core/util/useful.h +39 -44
  666. data/src/core/xds/grpc/xds_audit_logger_registry.cc +1 -0
  667. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +0 -125
  668. data/src/core/xds/grpc/xds_bootstrap_grpc.h +2 -27
  669. data/src/core/xds/grpc/xds_certificate_provider.cc +2 -1
  670. data/src/core/xds/grpc/xds_certificate_provider.h +3 -1
  671. data/src/core/xds/grpc/xds_client_grpc.cc +13 -14
  672. data/src/core/xds/grpc/xds_cluster.cc +0 -723
  673. data/src/core/xds/grpc/xds_cluster.h +2 -37
  674. data/src/core/xds/grpc/xds_cluster_parser.cc +730 -0
  675. data/src/core/xds/grpc/xds_cluster_parser.h +57 -0
  676. data/src/core/xds/grpc/xds_common_types.cc +33 -437
  677. data/src/core/xds/grpc/xds_common_types.h +7 -24
  678. data/src/core/xds/grpc/xds_common_types_parser.cc +467 -0
  679. data/src/core/xds/grpc/xds_common_types_parser.h +54 -0
  680. data/src/core/xds/grpc/xds_endpoint.cc +0 -419
  681. data/src/core/xds/grpc/xds_endpoint.h +0 -24
  682. data/src/core/xds/grpc/xds_endpoint_parser.cc +439 -0
  683. data/src/core/xds/grpc/xds_endpoint_parser.h +48 -0
  684. data/src/core/xds/grpc/xds_health_status.cc +0 -2
  685. data/src/core/xds/grpc/xds_health_status.h +0 -2
  686. data/src/core/xds/grpc/xds_http_fault_filter.cc +6 -1
  687. data/src/core/xds/grpc/xds_http_fault_filter.h +2 -1
  688. data/src/core/xds/grpc/{xds_http_filters.h → xds_http_filter.h} +6 -63
  689. data/src/core/xds/grpc/{xds_http_filters.cc → xds_http_filter_registry.cc} +2 -1
  690. data/src/core/xds/grpc/xds_http_filter_registry.h +98 -0
  691. data/src/core/xds/grpc/xds_http_rbac_filter.cc +5 -1
  692. data/src/core/xds/grpc/xds_http_rbac_filter.h +2 -1
  693. data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +8 -2
  694. data/src/core/xds/grpc/xds_http_stateful_session_filter.h +2 -1
  695. data/src/core/xds/grpc/xds_lb_policy_registry.cc +4 -5
  696. data/src/core/xds/grpc/xds_listener.cc +18 -982
  697. data/src/core/xds/grpc/xds_listener.h +1 -33
  698. data/src/core/xds/grpc/xds_listener_parser.cc +997 -0
  699. data/src/core/xds/grpc/xds_listener_parser.h +60 -0
  700. data/src/core/xds/grpc/xds_route_config.cc +0 -915
  701. data/src/core/xds/grpc/xds_route_config.h +6 -38
  702. data/src/core/xds/grpc/xds_route_config_parser.cc +969 -0
  703. data/src/core/xds/grpc/xds_route_config_parser.h +80 -0
  704. data/src/core/xds/grpc/xds_routing.cc +1 -1
  705. data/src/core/xds/grpc/xds_routing.h +1 -1
  706. data/src/core/xds/grpc/xds_server_grpc.cc +161 -0
  707. data/src/core/xds/grpc/xds_server_grpc.h +63 -0
  708. data/src/core/xds/grpc/xds_transport_grpc.cc +4 -5
  709. data/src/core/xds/xds_client/xds_api.cc +10 -10
  710. data/src/core/xds/xds_client/xds_client.cc +144 -177
  711. data/src/core/xds/xds_client/xds_client_stats.cc +21 -24
  712. data/src/ruby/ext/grpc/rb_call.c +2 -2
  713. data/src/ruby/ext/grpc/rb_channel.c +14 -14
  714. data/src/ruby/ext/grpc/rb_channel_args.c +1 -1
  715. data/src/ruby/ext/grpc/rb_compression_options.c +3 -3
  716. data/src/ruby/ext/grpc/rb_event_thread.c +2 -2
  717. data/src/ruby/ext/grpc/rb_grpc.c +4 -4
  718. data/src/ruby/ext/grpc/rb_grpc.h +8 -0
  719. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +0 -4
  720. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +0 -6
  721. data/src/ruby/ext/grpc/rb_server.c +1 -1
  722. data/src/ruby/lib/grpc/logconfig.rb +13 -0
  723. data/src/ruby/lib/grpc/version.rb +1 -1
  724. data/src/ruby/spec/logconfig_spec.rb +30 -0
  725. data/third_party/upb/upb/base/string_view.h +1 -1
  726. data/third_party/upb/upb/json/decode.c +1 -0
  727. data/third_party/upb/upb/mem/arena.c +67 -2
  728. data/third_party/upb/upb/mem/arena.h +11 -9
  729. data/third_party/upb/upb/mem/internal/arena.h +11 -8
  730. data/third_party/upb/upb/message/accessors.c +6 -5
  731. data/third_party/upb/upb/message/accessors.h +49 -38
  732. data/third_party/upb/upb/message/array.c +26 -3
  733. data/third_party/upb/upb/message/array.h +17 -9
  734. data/third_party/upb/upb/message/compat.c +5 -5
  735. data/third_party/upb/upb/message/compat.h +3 -3
  736. data/third_party/upb/upb/message/copy.c +12 -13
  737. data/third_party/upb/upb/message/internal/accessors.h +45 -35
  738. data/third_party/upb/upb/message/internal/array.h +23 -15
  739. data/third_party/upb/upb/message/internal/compare_unknown.c +289 -0
  740. data/third_party/upb/upb/message/internal/compare_unknown.h +49 -0
  741. data/third_party/upb/upb/message/internal/extension.c +11 -12
  742. data/third_party/upb/upb/message/internal/extension.h +9 -12
  743. data/third_party/upb/upb/message/internal/map.h +15 -0
  744. data/third_party/upb/upb/message/internal/map_sorter.h +4 -5
  745. data/third_party/upb/upb/message/internal/message.c +20 -3
  746. data/third_party/upb/upb/message/internal/message.h +10 -0
  747. data/third_party/upb/upb/message/internal/tagged_ptr.h +5 -5
  748. data/third_party/upb/upb/message/internal/types.h +41 -1
  749. data/third_party/upb/upb/message/map.c +25 -0
  750. data/third_party/upb/upb/message/map.h +11 -7
  751. data/third_party/upb/upb/message/message.c +83 -4
  752. data/third_party/upb/upb/message/message.h +20 -1
  753. data/third_party/upb/upb/message/tagged_ptr.h +4 -8
  754. data/third_party/upb/upb/mini_descriptor/build_enum.c +3 -3
  755. data/third_party/upb/upb/mini_descriptor/build_enum.h +6 -14
  756. data/third_party/upb/upb/mini_descriptor/decode.c +12 -1
  757. data/third_party/upb/upb/mini_descriptor/link.c +16 -18
  758. data/third_party/upb/upb/mini_table/enum.h +2 -4
  759. data/third_party/upb/upb/mini_table/extension.h +4 -12
  760. data/third_party/upb/upb/mini_table/field.h +12 -38
  761. data/third_party/upb/upb/mini_table/file.h +6 -19
  762. data/third_party/upb/upb/mini_table/internal/enum.h +1 -1
  763. data/third_party/upb/upb/mini_table/internal/extension.h +9 -9
  764. data/third_party/upb/upb/mini_table/internal/field.h +23 -23
  765. data/third_party/upb/upb/mini_table/internal/file.h +7 -7
  766. data/third_party/upb/upb/mini_table/internal/message.h +51 -27
  767. data/third_party/upb/upb/mini_table/internal/sub.h +4 -4
  768. data/third_party/upb/upb/mini_table/message.h +13 -22
  769. data/third_party/upb/upb/mini_table/sub.h +4 -12
  770. data/third_party/upb/upb/port/def.inc +12 -6
  771. data/third_party/upb/upb/port/undef.inc +1 -1
  772. data/third_party/upb/upb/reflection/def.hpp +27 -0
  773. data/third_party/upb/upb/reflection/def_pool.h +2 -2
  774. data/third_party/upb/upb/reflection/enum_def.c +5 -1
  775. data/third_party/upb/upb/reflection/enum_def.h +1 -0
  776. data/third_party/upb/upb/reflection/enum_value_def.c +3 -8
  777. data/third_party/upb/upb/reflection/field_def.c +61 -24
  778. data/third_party/upb/upb/reflection/field_def.h +3 -0
  779. data/third_party/upb/upb/reflection/file_def.c +30 -4
  780. data/third_party/upb/upb/reflection/file_def.h +3 -0
  781. data/third_party/upb/upb/reflection/internal/upb_edition_defaults.h +1 -1
  782. data/third_party/upb/upb/reflection/message.c +19 -7
  783. data/third_party/upb/upb/reflection/message_def.c +14 -9
  784. data/third_party/upb/upb/reflection/method_def.h +8 -7
  785. data/third_party/upb/upb/reflection/service_def.h +6 -5
  786. data/third_party/upb/upb/text/encode.c +10 -3
  787. data/third_party/upb/upb/wire/decode.c +91 -57
  788. data/third_party/upb/upb/wire/decode.h +11 -1
  789. data/third_party/upb/upb/wire/encode.c +48 -30
  790. data/third_party/upb/upb/wire/encode.h +9 -1
  791. data/third_party/upb/upb/wire/eps_copy_input_stream.h +3 -3
  792. data/third_party/upb/upb/wire/internal/decode_fast.c +25 -29
  793. data/third_party/upb/upb/wire/internal/reader.h +3 -3
  794. data/third_party/upb/upb/wire/reader.c +1 -2
  795. data/third_party/upb/upb/wire/reader.h +4 -8
  796. metadata +31 -9
  797. data/src/core/client_channel/config_selector.cc +0 -60
  798. data/src/core/lib/event_engine/trace.h +0 -37
  799. data/src/core/lib/surface/api_trace.h +0 -50
@@ -16,7 +16,9 @@
16
16
  #define GRPC_SRC_CORE_LIB_TRANSPORT_CALL_FILTERS_H
17
17
 
18
18
  #include <cstdint>
19
+ #include <limits>
19
20
  #include <memory>
21
+ #include <ostream>
20
22
  #include <type_traits>
21
23
 
22
24
  #include "absl/log/check.h"
@@ -26,11 +28,15 @@
26
28
  #include "src/core/lib/gprpp/dump_args.h"
27
29
  #include "src/core/lib/gprpp/ref_counted.h"
28
30
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
31
+ #include "src/core/lib/promise/if.h"
29
32
  #include "src/core/lib/promise/latch.h"
30
33
  #include "src/core/lib/promise/map.h"
31
34
  #include "src/core/lib/promise/promise.h"
35
+ #include "src/core/lib/promise/seq.h"
32
36
  #include "src/core/lib/promise/status_flag.h"
37
+ #include "src/core/lib/promise/try_seq.h"
33
38
  #include "src/core/lib/transport/call_final_info.h"
39
+ #include "src/core/lib/transport/call_state.h"
34
40
  #include "src/core/lib/transport/message.h"
35
41
  #include "src/core/lib/transport/metadata.h"
36
42
 
@@ -116,6 +122,10 @@ struct NoInterceptor {};
116
122
 
117
123
  namespace filters_detail {
118
124
 
125
+ inline void* Offset(void* base, size_t amt) {
126
+ return static_cast<char*>(base) + amt;
127
+ }
128
+
119
129
  // One call filter constructor
120
130
  // Contains enough information to allocate and initialize the
121
131
  // call data for one filter.
@@ -168,11 +178,10 @@ struct ResultOr {
168
178
  };
169
179
 
170
180
  // One filter operation metadata
171
- // Given a value of type V, produces a promise of type R.
172
- template <typename R, typename V>
181
+ // Given a value of type T, produces a promise of type ResultOr<T>.
182
+ template <typename T>
173
183
  struct Operator {
174
- using Result = R;
175
- using Arg = V;
184
+ using Arg = T;
176
185
  // Pointer to corresponding channel data for this filter
177
186
  void* channel_data;
178
187
  // Offset of the call data for this filter within the call data memory
@@ -180,13 +189,13 @@ struct Operator {
180
189
  // Initialize the promise data for this filter, and poll once.
181
190
  // Return the result of the poll.
182
191
  // If the promise finishes, also destroy the promise data!
183
- Poll<R> (*promise_init)(void* promise_data, void* call_data,
184
- void* channel_data, V value);
192
+ Poll<ResultOr<T>> (*promise_init)(void* promise_data, void* call_data,
193
+ void* channel_data, T value);
185
194
  // Poll the promise data for this filter.
186
195
  // If the promise finishes, also destroy the promise data!
187
196
  // Note that if the promise always finishes on the first poll, then supplying
188
197
  // this method is unnecessary (as it will never be called).
189
- Poll<R> (*poll)(void* promise_data);
198
+ Poll<ResultOr<T>> (*poll)(void* promise_data);
190
199
  // Destroy the promise data for this filter for an in-progress operation
191
200
  // before the promise finishes.
192
201
  // Note that if the promise always finishes on the first poll, then supplying
@@ -202,24 +211,19 @@ struct HalfCloseOperator {
202
211
  void (*half_close)(void* call_data, void* channel_data);
203
212
  };
204
213
 
205
- void RunHalfClose(absl::Span<const HalfCloseOperator> ops, void* call_data);
214
+ struct ServerTrailingMetadataOperator {
215
+ // Pointer to corresponding channel data for this filter
216
+ void* channel_data;
217
+ // Offset of the call data for this filter within the call data memory
218
+ size_t call_offset;
219
+ ServerMetadataHandle (*server_trailing_metadata)(
220
+ void* call_data, void* channel_data, ServerMetadataHandle metadata);
221
+ };
206
222
 
207
- // We divide operations into fallible and infallible.
208
- // Fallible operations can fail, and that failure terminates the call.
209
- // Infallible operations cannot fail.
210
- // Fallible operations are used for client initial, and server initial metadata,
211
- // and messages.
212
- // Infallible operations are used for server trailing metadata.
213
- // (This is because server trailing metadata occurs when the call is finished -
214
- // and so we couldn't possibly become more finished - and also because it's the
215
- // preferred representation of failure anyway!)
216
-
217
- // An operation that could fail: takes a T argument, produces a ResultOr<T>
218
- template <typename T>
219
- using FallibleOperator = Operator<ResultOr<T>, T>;
220
- // And one that cannot: takes a T argument, produces a T
221
- template <typename T>
222
- using InfallibleOperator = Operator<T, T>;
223
+ void RunHalfClose(absl::Span<const HalfCloseOperator> ops, void* call_data);
224
+ ServerMetadataHandle RunServerTrailingMetadata(
225
+ absl::Span<const ServerTrailingMetadataOperator> ops, void* call_data,
226
+ ServerMetadataHandle md);
223
227
 
224
228
  // One call finalizer
225
229
  struct Finalizer {
@@ -231,19 +235,20 @@ struct Finalizer {
231
235
 
232
236
  // A layout of operations for a given filter stack
233
237
  // This includes which operations, how much memory is required, what alignment.
234
- template <typename Op>
238
+ template <typename T>
235
239
  struct Layout {
236
240
  size_t promise_size = 0;
237
241
  size_t promise_alignment = 0;
238
- std::vector<Op> ops;
242
+ std::vector<Operator<T>> ops;
239
243
 
240
- void Add(size_t filter_promise_size, size_t filter_promise_alignment, Op op) {
244
+ void Add(size_t filter_promise_size, size_t filter_promise_alignment,
245
+ Operator<T> op) {
241
246
  promise_size = std::max(promise_size, filter_promise_size);
242
247
  promise_alignment = std::max(promise_alignment, filter_promise_alignment);
243
248
  ops.push_back(op);
244
249
  }
245
250
 
246
- void Reverse() { std::reverse(ops.begin(), ops.end()); }
251
+ void Reverse() { absl::c_reverse(ops); }
247
252
  };
248
253
 
249
254
  // AddOp and friends
@@ -263,16 +268,7 @@ struct AddOpImpl;
263
268
 
264
269
  template <typename FunctionImpl, FunctionImpl impl, typename FilterType,
265
270
  typename T>
266
- void AddOp(FilterType* channel_data, size_t call_offset,
267
- Layout<FallibleOperator<T>>& to) {
268
- AddOpImpl<FilterType, T, FunctionImpl, impl>::Add(channel_data, call_offset,
269
- to);
270
- }
271
-
272
- template <typename FunctionImpl, FunctionImpl impl, typename FilterType,
273
- typename T>
274
- void AddOp(FilterType* channel_data, size_t call_offset,
275
- Layout<InfallibleOperator<T>>& to) {
271
+ void AddOp(FilterType* channel_data, size_t call_offset, Layout<T>& to) {
276
272
  AddOpImpl<FilterType, T, FunctionImpl, impl>::Add(channel_data, call_offset,
277
273
  to);
278
274
  }
@@ -303,13 +299,73 @@ template <typename FilterType>
303
299
  void AddHalfClose(FilterType*, size_t, const NoInterceptor*,
304
300
  std::vector<HalfCloseOperator>&) {}
305
301
 
302
+ template <typename FilterType>
303
+ void AddServerTrailingMetadata(
304
+ FilterType* channel_data, size_t call_offset,
305
+ void (FilterType::Call::*)(ServerMetadata&),
306
+ std::vector<ServerTrailingMetadataOperator>& to) {
307
+ to.push_back(ServerTrailingMetadataOperator{
308
+ channel_data, call_offset,
309
+ [](void* call_data, void*, ServerMetadataHandle metadata) {
310
+ static_cast<typename FilterType::Call*>(call_data)
311
+ ->OnServerTrailingMetadata(*metadata);
312
+ return metadata;
313
+ }});
314
+ }
315
+
316
+ template <typename FilterType>
317
+ void AddServerTrailingMetadata(
318
+ FilterType* channel_data, size_t call_offset,
319
+ void (FilterType::Call::*)(ServerMetadata&, FilterType*),
320
+ std::vector<ServerTrailingMetadataOperator>& to) {
321
+ to.push_back(ServerTrailingMetadataOperator{
322
+ channel_data, call_offset,
323
+ [](void* call_data, void* channel_data, ServerMetadataHandle metadata) {
324
+ static_cast<typename FilterType::Call*>(call_data)
325
+ ->OnServerTrailingMetadata(*metadata,
326
+ static_cast<FilterType*>(channel_data));
327
+ return metadata;
328
+ }});
329
+ }
330
+
331
+ template <typename FilterType>
332
+ void AddServerTrailingMetadata(
333
+ FilterType* channel_data, size_t call_offset,
334
+ absl::Status (FilterType::Call::*)(ServerMetadata&),
335
+ std::vector<ServerTrailingMetadataOperator>& to) {
336
+ to.push_back(ServerTrailingMetadataOperator{
337
+ channel_data, call_offset,
338
+ [](void* call_data, void*, ServerMetadataHandle metadata) {
339
+ auto r = static_cast<typename FilterType::Call*>(call_data)
340
+ ->OnServerTrailingMetadata(*metadata);
341
+ if (r.ok()) return metadata;
342
+ return CancelledServerMetadataFromStatus(r);
343
+ }});
344
+ }
345
+
346
+ template <typename FilterType>
347
+ void AddServerTrailingMetadata(
348
+ FilterType* channel_data, size_t call_offset,
349
+ ServerMetadataHandle (FilterType::Call::*)(ServerMetadataHandle),
350
+ std::vector<ServerTrailingMetadataOperator>& to) {
351
+ to.push_back(ServerTrailingMetadataOperator{
352
+ channel_data, call_offset,
353
+ [](void* call_data, void*, ServerMetadataHandle metadata) {
354
+ return static_cast<typename FilterType::Call*>(call_data)
355
+ ->OnServerTrailingMetadata(std::move(metadata));
356
+ }});
357
+ }
358
+
359
+ template <typename FilterType>
360
+ void AddServerTrailingMetadata(FilterType*, size_t, const NoInterceptor*,
361
+ std::vector<ServerTrailingMetadataOperator>&) {}
362
+
306
363
  // const NoInterceptor $EVENT
307
364
  // These do nothing, and specifically DO NOT add an operation to the layout.
308
365
  // Supported for fallible & infallible operations.
309
366
  template <typename FilterType, typename T, const NoInterceptor* which>
310
367
  struct AddOpImpl<FilterType, T, const NoInterceptor*, which> {
311
- static void Add(FilterType*, size_t, Layout<FallibleOperator<T>>&) {}
312
- static void Add(FilterType*, size_t, Layout<InfallibleOperator<T>>&) {}
368
+ static void Add(FilterType*, size_t, Layout<T>&) {}
313
369
  };
314
370
 
315
371
  // void $INTERCEPTOR_NAME($VALUE_TYPE&)
@@ -317,10 +373,9 @@ template <typename FilterType, typename T,
317
373
  void (FilterType::Call::*impl)(typename T::element_type&)>
318
374
  struct AddOpImpl<FilterType, T,
319
375
  void (FilterType::Call::*)(typename T::element_type&), impl> {
320
- static void Add(FilterType* channel_data, size_t call_offset,
321
- Layout<FallibleOperator<T>>& to) {
376
+ static void Add(FilterType* channel_data, size_t call_offset, Layout<T>& to) {
322
377
  to.Add(0, 0,
323
- FallibleOperator<T>{
378
+ Operator<T>{
324
379
  channel_data,
325
380
  call_offset,
326
381
  [](void*, void* call_data, void*, T value) -> Poll<ResultOr<T>> {
@@ -332,21 +387,6 @@ struct AddOpImpl<FilterType, T,
332
387
  nullptr,
333
388
  });
334
389
  }
335
- static void Add(FilterType* channel_data, size_t call_offset,
336
- Layout<InfallibleOperator<T>>& to) {
337
- to.Add(0, 0,
338
- InfallibleOperator<T>{
339
- channel_data,
340
- call_offset,
341
- [](void*, void* call_data, void*, T value) -> Poll<T> {
342
- (static_cast<typename FilterType::Call*>(call_data)->*impl)(
343
- *value);
344
- return std::move(value);
345
- },
346
- nullptr,
347
- nullptr,
348
- });
349
- }
350
390
  };
351
391
 
352
392
  // void $INTERCEPTOR_NAME($VALUE_TYPE&, FilterType*)
@@ -356,10 +396,9 @@ template <typename FilterType, typename T,
356
396
  struct AddOpImpl<
357
397
  FilterType, T,
358
398
  void (FilterType::Call::*)(typename T::element_type&, FilterType*), impl> {
359
- static void Add(FilterType* channel_data, size_t call_offset,
360
- Layout<FallibleOperator<T>>& to) {
399
+ static void Add(FilterType* channel_data, size_t call_offset, Layout<T>& to) {
361
400
  to.Add(0, 0,
362
- FallibleOperator<T>{
401
+ Operator<T>{
363
402
  channel_data,
364
403
  call_offset,
365
404
  [](void*, void* call_data, void* channel_data,
@@ -372,33 +411,16 @@ struct AddOpImpl<
372
411
  nullptr,
373
412
  });
374
413
  }
375
- static void Add(FilterType* channel_data, size_t call_offset,
376
- Layout<InfallibleOperator<T>>& to) {
377
- to.Add(
378
- 0, 0,
379
- InfallibleOperator<T>{
380
- channel_data,
381
- call_offset,
382
- [](void*, void* call_data, void* channel_data, T value) -> Poll<T> {
383
- (static_cast<typename FilterType::Call*>(call_data)->*impl)(
384
- *value, static_cast<FilterType*>(channel_data));
385
- return std::move(value);
386
- },
387
- nullptr,
388
- nullptr,
389
- });
390
- }
391
414
  };
392
415
 
393
416
  // $VALUE_HANDLE $INTERCEPTOR_NAME($VALUE_HANDLE, FilterType*)
394
417
  template <typename FilterType, typename T,
395
418
  T (FilterType::Call::*impl)(T, FilterType*)>
396
419
  struct AddOpImpl<FilterType, T, T (FilterType::Call::*)(T, FilterType*), impl> {
397
- static void Add(FilterType* channel_data, size_t call_offset,
398
- Layout<FallibleOperator<T>>& to) {
420
+ static void Add(FilterType* channel_data, size_t call_offset, Layout<T>& to) {
399
421
  to.Add(
400
422
  0, 0,
401
- FallibleOperator<T>{
423
+ Operator<T>{
402
424
  channel_data,
403
425
  call_offset,
404
426
  [](void*, void* call_data, void* channel_data,
@@ -412,24 +434,6 @@ struct AddOpImpl<FilterType, T, T (FilterType::Call::*)(T, FilterType*), impl> {
412
434
  nullptr,
413
435
  });
414
436
  }
415
- static void Add(FilterType* channel_data, size_t call_offset,
416
- Layout<InfallibleOperator<T>>& to) {
417
- to.Add(
418
- 0, 0,
419
- InfallibleOperator<T>{
420
- channel_data,
421
- call_offset,
422
- [](void*, void* call_data, void* channel_data, T value) -> Poll<T> {
423
- (static_cast<typename FilterType::Call*>(call_data)->*impl)(
424
- *value, static_cast<FilterType*>(channel_data));
425
- return (
426
- static_cast<typename FilterType::Call*>(call_data)->*impl)(
427
- std::move(value), static_cast<FilterType*>(channel_data));
428
- },
429
- nullptr,
430
- nullptr,
431
- });
432
- }
433
437
  };
434
438
 
435
439
  // absl::Status $INTERCEPTOR_NAME($VALUE_TYPE&)
@@ -438,11 +442,10 @@ template <typename FilterType, typename T,
438
442
  struct AddOpImpl<FilterType, T,
439
443
  absl::Status (FilterType::Call::*)(typename T::element_type&),
440
444
  impl> {
441
- static void Add(FilterType* channel_data, size_t call_offset,
442
- Layout<FallibleOperator<T>>& to) {
445
+ static void Add(FilterType* channel_data, size_t call_offset, Layout<T>& to) {
443
446
  to.Add(
444
447
  0, 0,
445
- FallibleOperator<T>{
448
+ Operator<T>{
446
449
  channel_data,
447
450
  call_offset,
448
451
  [](void*, void* call_data, void*, T value) -> Poll<ResultOr<T>> {
@@ -457,24 +460,6 @@ struct AddOpImpl<FilterType, T,
457
460
  nullptr,
458
461
  });
459
462
  }
460
- static void Add(FilterType* channel_data, size_t call_offset,
461
- Layout<InfallibleOperator<T>>& to) {
462
- to.Add(
463
- 0, 0,
464
- InfallibleOperator<T>{
465
- channel_data,
466
- call_offset,
467
- [](void*, void* call_data, void*, T value) -> Poll<T> {
468
- auto r =
469
- (static_cast<typename FilterType::Call*>(call_data)->*impl)(
470
- *value);
471
- if (r.ok()) return std::move(value);
472
- return StatusCast<ServerMetadataHandle>(std::move(r));
473
- },
474
- nullptr,
475
- nullptr,
476
- });
477
- }
478
463
  };
479
464
 
480
465
  // absl::Status $INTERCEPTOR_NAME(const $VALUE_TYPE&)
@@ -484,11 +469,10 @@ template <typename FilterType, typename T,
484
469
  struct AddOpImpl<
485
470
  FilterType, T,
486
471
  absl::Status (FilterType::Call::*)(const typename T::element_type&), impl> {
487
- static void Add(FilterType* channel_data, size_t call_offset,
488
- Layout<FallibleOperator<T>>& to) {
472
+ static void Add(FilterType* channel_data, size_t call_offset, Layout<T>& to) {
489
473
  to.Add(
490
474
  0, 0,
491
- FallibleOperator<T>{
475
+ Operator<T>{
492
476
  channel_data,
493
477
  call_offset,
494
478
  [](void*, void* call_data, void*, T value) -> Poll<ResultOr<T>> {
@@ -513,11 +497,10 @@ struct AddOpImpl<FilterType, T,
513
497
  absl::Status (FilterType::Call::*)(typename T::element_type&,
514
498
  FilterType*),
515
499
  impl> {
516
- static void Add(FilterType* channel_data, size_t call_offset,
517
- Layout<FallibleOperator<T>>& to) {
500
+ static void Add(FilterType* channel_data, size_t call_offset, Layout<T>& to) {
518
501
  to.Add(
519
502
  0, 0,
520
- FallibleOperator<T>{
503
+ Operator<T>{
521
504
  channel_data,
522
505
  call_offset,
523
506
  [](void*, void* call_data, void* channel_data,
@@ -543,11 +526,10 @@ struct AddOpImpl<FilterType, T,
543
526
  absl::Status (FilterType::Call::*)(
544
527
  const typename T::element_type&, FilterType*),
545
528
  impl> {
546
- static void Add(FilterType* channel_data, size_t call_offset,
547
- Layout<FallibleOperator<T>>& to) {
529
+ static void Add(FilterType* channel_data, size_t call_offset, Layout<T>& to) {
548
530
  to.Add(
549
531
  0, 0,
550
- FallibleOperator<T>{
532
+ Operator<T>{
551
533
  channel_data,
552
534
  call_offset,
553
535
  [](void*, void* call_data, void* channel_data,
@@ -571,11 +553,10 @@ template <typename FilterType, typename T,
571
553
  struct AddOpImpl<FilterType, T,
572
554
  absl::StatusOr<T> (FilterType::Call::*)(T, FilterType*),
573
555
  impl> {
574
- static void Add(FilterType* channel_data, size_t call_offset,
575
- Layout<FallibleOperator<T>>& to) {
556
+ static void Add(FilterType* channel_data, size_t call_offset, Layout<T>& to) {
576
557
  to.Add(
577
558
  0, 0,
578
- FallibleOperator<T>{
559
+ Operator<T>{
579
560
  channel_data,
580
561
  call_offset,
581
562
  [](void*, void* call_data, void* channel_data,
@@ -601,11 +582,10 @@ struct AddOpImpl<FilterType, T,
601
582
  ServerMetadataHandle (FilterType::Call::*)(
602
583
  typename T::element_type&),
603
584
  impl> {
604
- static void Add(FilterType* channel_data, size_t call_offset,
605
- Layout<FallibleOperator<T>>& to) {
585
+ static void Add(FilterType* channel_data, size_t call_offset, Layout<T>& to) {
606
586
  to.Add(
607
587
  0, 0,
608
- FallibleOperator<T>{
588
+ Operator<T>{
609
589
  channel_data,
610
590
  call_offset,
611
591
  [](void*, void* call_data, void*, T value) -> Poll<ResultOr<T>> {
@@ -630,11 +610,10 @@ struct AddOpImpl<FilterType, T,
630
610
  ServerMetadataHandle (FilterType::Call::*)(
631
611
  const typename T::element_type&),
632
612
  impl> {
633
- static void Add(FilterType* channel_data, size_t call_offset,
634
- Layout<FallibleOperator<T>>& to) {
613
+ static void Add(FilterType* channel_data, size_t call_offset, Layout<T>& to) {
635
614
  to.Add(
636
615
  0, 0,
637
- FallibleOperator<T>{
616
+ Operator<T>{
638
617
  channel_data,
639
618
  call_offset,
640
619
  [](void*, void* call_data, void*, T value) -> Poll<ResultOr<T>> {
@@ -659,11 +638,10 @@ struct AddOpImpl<FilterType, T,
659
638
  ServerMetadataHandle (FilterType::Call::*)(
660
639
  typename T::element_type&, FilterType*),
661
640
  impl> {
662
- static void Add(FilterType* channel_data, size_t call_offset,
663
- Layout<FallibleOperator<T>>& to) {
641
+ static void Add(FilterType* channel_data, size_t call_offset, Layout<T>& to) {
664
642
  to.Add(
665
643
  0, 0,
666
- FallibleOperator<T>{
644
+ Operator<T>{
667
645
  channel_data,
668
646
  call_offset,
669
647
  [](void*, void* call_data, void* channel_data,
@@ -689,11 +667,10 @@ struct AddOpImpl<FilterType, T,
689
667
  ServerMetadataHandle (FilterType::Call::*)(
690
668
  const typename T::element_type&, FilterType*),
691
669
  impl> {
692
- static void Add(FilterType* channel_data, size_t call_offset,
693
- Layout<FallibleOperator<T>>& to) {
670
+ static void Add(FilterType* channel_data, size_t call_offset, Layout<T>& to) {
694
671
  to.Add(
695
672
  0, 0,
696
- FallibleOperator<T>{
673
+ Operator<T>{
697
674
  channel_data,
698
675
  call_offset,
699
676
  [](void*, void* call_data, void* channel_data,
@@ -717,8 +694,7 @@ template <typename FilterType, typename T, typename R,
717
694
  struct AddOpImpl<
718
695
  FilterType, T, R (FilterType::Call::*)(typename T::element_type&), impl,
719
696
  absl::enable_if_t<std::is_same<absl::Status, PromiseResult<R>>::value>> {
720
- static void Add(FilterType* channel_data, size_t call_offset,
721
- Layout<FallibleOperator<T>>& to) {
697
+ static void Add(FilterType* channel_data, size_t call_offset, Layout<T>& to) {
722
698
  class Promise {
723
699
  public:
724
700
  Promise(T value, typename FilterType::Call* call_data, FilterType*)
@@ -733,7 +709,7 @@ struct AddOpImpl<
733
709
  if (r->ok()) {
734
710
  return ResultOr<T>{std::move(value), nullptr};
735
711
  }
736
- return ResultOr<T>{nullptr, ServerMetadataFromStatus(*r)};
712
+ return ResultOr<T>{nullptr, CancelledServerMetadataFromStatus(*r)};
737
713
  }
738
714
 
739
715
  private:
@@ -741,7 +717,7 @@ struct AddOpImpl<
741
717
  GPR_NO_UNIQUE_ADDRESS R impl_;
742
718
  };
743
719
  to.Add(sizeof(Promise), alignof(Promise),
744
- FallibleOperator<T>{
720
+ Operator<T>{
745
721
  channel_data,
746
722
  call_offset,
747
723
  [](void* promise_data, void* call_data, void* channel_data,
@@ -770,8 +746,7 @@ struct AddOpImpl<
770
746
  R (FilterType::Call::*)(typename T::element_type&, FilterType*), impl,
771
747
  absl::enable_if_t<!std::is_same<R, absl::Status>::value &&
772
748
  std::is_same<absl::Status, PromiseResult<R>>::value>> {
773
- static void Add(FilterType* channel_data, size_t call_offset,
774
- Layout<FallibleOperator<T>>& to) {
749
+ static void Add(FilterType* channel_data, size_t call_offset, Layout<T>& to) {
775
750
  class Promise {
776
751
  public:
777
752
  Promise(T value, typename FilterType::Call* call_data,
@@ -788,7 +763,7 @@ struct AddOpImpl<
788
763
  if (r->ok()) {
789
764
  return ResultOr<T>{std::move(value), nullptr};
790
765
  }
791
- return ResultOr<T>{nullptr, ServerMetadataFromStatus(*r)};
766
+ return ResultOr<T>{nullptr, CancelledServerMetadataFromStatus(*r)};
792
767
  }
793
768
 
794
769
  private:
@@ -796,7 +771,7 @@ struct AddOpImpl<
796
771
  GPR_NO_UNIQUE_ADDRESS R impl_;
797
772
  };
798
773
  to.Add(sizeof(Promise), alignof(Promise),
799
- FallibleOperator<T>{
774
+ Operator<T>{
800
775
  channel_data,
801
776
  call_offset,
802
777
  [](void* promise_data, void* call_data, void* channel_data,
@@ -824,8 +799,7 @@ template <typename FilterType, typename T, typename R,
824
799
  struct AddOpImpl<FilterType, T, R (FilterType::Call::*)(T, FilterType*), impl,
825
800
  absl::enable_if_t<std::is_same<absl::StatusOr<T>,
826
801
  PromiseResult<R>>::value>> {
827
- static void Add(FilterType* channel_data, size_t call_offset,
828
- Layout<FallibleOperator<T>>& to) {
802
+ static void Add(FilterType* channel_data, size_t call_offset, Layout<T>& to) {
829
803
  class Promise {
830
804
  public:
831
805
  Promise(T value, typename FilterType::Call* call_data,
@@ -838,14 +812,15 @@ struct AddOpImpl<FilterType, T, R (FilterType::Call::*)(T, FilterType*), impl,
838
812
  if (r == nullptr) return Pending{};
839
813
  this->~Promise();
840
814
  if (r->ok()) return ResultOr<T>{std::move(**r), nullptr};
841
- return ResultOr<T>{nullptr, ServerMetadataFromStatus(r->status())};
815
+ return ResultOr<T>{nullptr,
816
+ CancelledServerMetadataFromStatus(r->status())};
842
817
  }
843
818
 
844
819
  private:
845
820
  GPR_NO_UNIQUE_ADDRESS R impl_;
846
821
  };
847
822
  to.Add(sizeof(Promise), alignof(Promise),
848
- FallibleOperator<T>{
823
+ Operator<T>{
849
824
  channel_data,
850
825
  call_offset,
851
826
  [](void* promise_data, void* call_data, void* channel_data,
@@ -887,12 +862,12 @@ struct StackData {
887
862
  // For each kind of operation, a layout of the operations for this call.
888
863
  // (there's some duplicate data here, and that's ok: we want to avoid
889
864
  // pointer chasing as much as possible when executing a call)
890
- Layout<FallibleOperator<ClientMetadataHandle>> client_initial_metadata;
891
- Layout<FallibleOperator<ServerMetadataHandle>> server_initial_metadata;
892
- Layout<FallibleOperator<MessageHandle>> client_to_server_messages;
865
+ Layout<ClientMetadataHandle> client_initial_metadata;
866
+ Layout<ServerMetadataHandle> server_initial_metadata;
867
+ Layout<MessageHandle> client_to_server_messages;
893
868
  std::vector<HalfCloseOperator> client_to_server_half_close;
894
- Layout<FallibleOperator<MessageHandle>> server_to_client_messages;
895
- Layout<InfallibleOperator<ServerMetadataHandle>> server_trailing_metadata;
869
+ Layout<MessageHandle> server_to_client_messages;
870
+ std::vector<ServerTrailingMetadataOperator> server_trailing_metadata;
896
871
  // A list of finalizers for this call.
897
872
  // We use a bespoke data structure here because finalizers can never be
898
873
  // asynchronous.
@@ -901,6 +876,17 @@ struct StackData {
901
876
  // (to capture ownership of channel data)
902
877
  std::vector<ChannelDataDestructor> channel_data_destructors;
903
878
 
879
+ bool empty() const {
880
+ return filter_constructor.empty() && filter_destructor.empty() &&
881
+ client_initial_metadata.ops.empty() &&
882
+ server_initial_metadata.ops.empty() &&
883
+ client_to_server_messages.ops.empty() &&
884
+ client_to_server_half_close.empty() &&
885
+ server_to_client_messages.ops.empty() &&
886
+ server_trailing_metadata.empty() && finalizers.empty() &&
887
+ channel_data_destructors.empty();
888
+ }
889
+
904
890
  // Add one filter to the list of filters, and update alignment.
905
891
  // Returns the offset of the call data for this filter.
906
892
  // Specifically does not update any of the layouts or finalizers.
@@ -1030,9 +1016,9 @@ struct StackData {
1030
1016
  template <typename FilterType>
1031
1017
  void AddServerTrailingMetadataOp(FilterType* channel_data,
1032
1018
  size_t call_offset) {
1033
- AddOp<decltype(&FilterType::Call::OnServerTrailingMetadata),
1034
- &FilterType::Call::OnServerTrailingMetadata>(
1035
- channel_data, call_offset, server_trailing_metadata);
1019
+ AddServerTrailingMetadata(channel_data, call_offset,
1020
+ &FilterType::Call::OnServerTrailingMetadata,
1021
+ server_trailing_metadata);
1036
1022
  }
1037
1023
 
1038
1024
  // Finalizer interception adders
@@ -1104,8 +1090,7 @@ class OperationExecutor {
1104
1090
  // Start executing a layout. May allocate space to store the relevant promise.
1105
1091
  // Returns the result of the first poll.
1106
1092
  // If the promise finishes, also destroy the promise data.
1107
- Poll<ResultOr<T>> Start(const Layout<FallibleOperator<T>>* layout, T input,
1108
- void* call_data);
1093
+ Poll<ResultOr<T>> Start(const Layout<T>* layout, T input, void* call_data);
1109
1094
  // Continue executing a layout. Returns the result of the next poll.
1110
1095
  // If the promise finishes, also destroy the promise data.
1111
1096
  Poll<ResultOr<T>> Step(void* call_data);
@@ -1127,133 +1112,8 @@ class OperationExecutor {
1127
1112
  Poll<ResultOr<T>> ContinueStep(void* call_data);
1128
1113
 
1129
1114
  void* promise_data_ = nullptr;
1130
- const FallibleOperator<T>* ops_;
1131
- const FallibleOperator<T>* end_ops_;
1132
- };
1133
-
1134
- // Per OperationExecutor, but for infallible operation sequences.
1135
- template <typename T>
1136
- class InfallibleOperationExecutor {
1137
- public:
1138
- InfallibleOperationExecutor() = default;
1139
- ~InfallibleOperationExecutor();
1140
- InfallibleOperationExecutor(const InfallibleOperationExecutor&) = delete;
1141
- InfallibleOperationExecutor& operator=(const InfallibleOperationExecutor&) =
1142
- delete;
1143
- InfallibleOperationExecutor(InfallibleOperationExecutor&& other) noexcept
1144
- : ops_(other.ops_), end_ops_(other.end_ops_) {
1145
- // Movable iff we're not running.
1146
- DCHECK_EQ(other.promise_data_, nullptr);
1147
- }
1148
- InfallibleOperationExecutor& operator=(
1149
- InfallibleOperationExecutor&& other) noexcept {
1150
- DCHECK_EQ(other.promise_data_, nullptr);
1151
- DCHECK_EQ(promise_data_, nullptr);
1152
- ops_ = other.ops_;
1153
- end_ops_ = other.end_ops_;
1154
- return *this;
1155
- }
1156
-
1157
- // IsRunning() is true if we're currently executing a sequence of operations.
1158
- bool IsRunning() const { return promise_data_ != nullptr; }
1159
- // Start executing a layout. May allocate space to store the relevant promise.
1160
- // Returns the result of the first poll.
1161
- // If the promise finishes, also destroy the promise data.
1162
- Poll<T> Start(const Layout<InfallibleOperator<T>>* layout, T input,
1163
- void* call_data);
1164
- // Continue executing a layout. Returns the result of the next poll.
1165
- // If the promise finishes, also destroy the promise data.
1166
- Poll<T> Step(void* call_data);
1167
-
1168
- private:
1169
- // Start polling on the current step of the layout.
1170
- // `input` is the current value (either the input to the first step, or the
1171
- // so far transformed value)
1172
- // `call_data` is the call data for the filter stack.
1173
- // If this op finishes immediately then we iterative move to the next step.
1174
- // If we reach the end up the ops, we return the overall poll result,
1175
- // otherwise we return Pending.
1176
- Poll<T> InitStep(T input, void* call_data);
1177
- // Continue polling on the current step of the layout.
1178
- // Called on the next poll after InitStep returns pending.
1179
- // If the promise is still pending, returns this.
1180
- // If the promise completes we call into InitStep to continue execution
1181
- // through the filters.
1182
- Poll<T> ContinueStep(void* call_data);
1183
-
1184
- void* promise_data_ = nullptr;
1185
- const InfallibleOperator<T>* ops_;
1186
- const InfallibleOperator<T>* end_ops_;
1187
- };
1188
-
1189
- // The current state of a pipe.
1190
- // CallFilters expose a set of pipe like objects for client & server initial
1191
- // metadata and for messages.
1192
- // This class tracks the state of one of those pipes.
1193
- // Size matters here: this state is kept for the lifetime of a call, and we keep
1194
- // multiple of them.
1195
- // This class encapsulates the untyped work of the state machine; there are
1196
- // typed wrappers around this class as private members of CallFilters that
1197
- // augment it to provide all the functionality that we must.
1198
- class PipeState {
1199
- public:
1200
- struct StartPushed {};
1201
- PipeState() = default;
1202
- explicit PipeState(StartPushed) : state_(ValueState::kQueued) {}
1203
- // Start the pipe: allows pulls to proceed
1204
- void Start();
1205
- // A push operation is beginning
1206
- void BeginPush();
1207
- // A previously started push operation has completed
1208
- void DropPush();
1209
- // Poll for push completion: occurs after the corresponding Pull()
1210
- Poll<StatusFlag> PollPush();
1211
- // Poll for pull completion; returns Failure{} if closed with error,
1212
- // true if a value is available, or false if the pipe was closed without
1213
- // error.
1214
- Poll<ValueOrFailure<bool>> PollPull();
1215
- // A pulled value has been consumed: we can unblock the push
1216
- void AckPull();
1217
- // A previously started pull operation has completed
1218
- void DropPull();
1219
- // Close sending
1220
- void CloseSending();
1221
- // Close sending with error
1222
- void CloseWithError();
1223
- // Poll for closedness - if true, closed with error
1224
- Poll<bool> PollClosed();
1225
-
1226
- bool holds_error() const { return state_ == ValueState::kError; }
1227
-
1228
- std::string DebugString() const;
1229
-
1230
- private:
1231
- enum class ValueState : uint8_t {
1232
- // Nothing sending nor receiving
1233
- kIdle,
1234
- // Sent, but not yet received
1235
- kQueued,
1236
- // Trying to receive, but not yet sent
1237
- kWaiting,
1238
- // Ready to start processing, but not yet started
1239
- // (we have the value to send through the pipe, the reader is waiting,
1240
- // but it's not yet been polled)
1241
- kReady,
1242
- // Processing through filters
1243
- kProcessing,
1244
- // Closed sending
1245
- kClosed,
1246
- // Closed due to failure
1247
- kError
1248
- };
1249
- // Waiter for a promise blocked waiting to send.
1250
- IntraActivityWaiter wait_send_;
1251
- // Waiter for a promise blocked waiting to receive.
1252
- IntraActivityWaiter wait_recv_;
1253
- // Current state.
1254
- ValueState state_ = ValueState::kIdle;
1255
- // Has the pipe been started?
1256
- bool started_ = false;
1115
+ const Operator<T>* ops_;
1116
+ const Operator<T>* end_ops_;
1257
1117
  };
1258
1118
 
1259
1119
  template <typename Fn>
@@ -1424,42 +1284,187 @@ class CallFilters {
1424
1284
  CallFilters(CallFilters&&) = delete;
1425
1285
  CallFilters& operator=(CallFilters&&) = delete;
1426
1286
 
1427
- void SetStack(RefCountedPtr<Stack> stack);
1287
+ void AddStack(RefCountedPtr<Stack> stack) {
1288
+ if (stack->data_.empty()) return;
1289
+ stacks_.emplace_back(std::move(stack));
1290
+ }
1291
+ void Start();
1428
1292
 
1429
1293
  // Access client initial metadata before it's processed
1430
1294
  ClientMetadata* unprocessed_client_initial_metadata() {
1431
- return client_initial_metadata_.get();
1295
+ return push_client_initial_metadata_.get();
1432
1296
  }
1433
1297
 
1298
+ private:
1299
+ template <typename Output, typename Input,
1300
+ Input(CallFilters::*input_location),
1301
+ filters_detail::Layout<Input>(filters_detail::StackData::*layout),
1302
+ void (CallState::*on_done)(), typename StackIterator>
1303
+ class Executor {
1304
+ public:
1305
+ Executor(CallFilters* filters, StackIterator stack_begin,
1306
+ StackIterator stack_end)
1307
+ : stack_current_(stack_begin),
1308
+ stack_end_(stack_end),
1309
+ filters_(filters) {
1310
+ DCHECK_NE((filters_->*input_location).get(), nullptr);
1311
+ }
1312
+
1313
+ Poll<ValueOrFailure<Output>> operator()() {
1314
+ if ((filters_->*input_location) != nullptr) {
1315
+ if (stack_current_ == stack_end_) {
1316
+ DCHECK_NE((filters_->*input_location).get(), nullptr);
1317
+ (filters_->call_state_.*on_done)();
1318
+ return Output(std::move(filters_->*input_location));
1319
+ }
1320
+ return FinishStep(executor_.Start(
1321
+ &(stack_current_->stack->data_.*layout),
1322
+ std::move(filters_->*input_location), filters_->call_data_));
1323
+ } else {
1324
+ return FinishStep(executor_.Step(filters_->call_data_));
1325
+ }
1326
+ }
1327
+
1328
+ private:
1329
+ Poll<ValueOrFailure<Output>> FinishStep(
1330
+ Poll<filters_detail::ResultOr<Input>> p) {
1331
+ auto* r = p.value_if_ready();
1332
+ if (r == nullptr) return Pending{};
1333
+ if (r->ok != nullptr) {
1334
+ ++stack_current_;
1335
+ if (stack_current_ == stack_end_) {
1336
+ (filters_->call_state_.*on_done)();
1337
+ return ValueOrFailure<Output>{std::move(r->ok)};
1338
+ }
1339
+ return FinishStep(
1340
+ executor_.Start(&(stack_current_->stack->data_.*layout),
1341
+ std::move(r->ok), filters_->call_data_));
1342
+ }
1343
+ (filters_->call_state_.*on_done)();
1344
+ filters_->PushServerTrailingMetadata(std::move(r->error));
1345
+ return Failure{};
1346
+ }
1347
+
1348
+ StackIterator stack_current_;
1349
+ StackIterator stack_end_;
1350
+ CallFilters* filters_;
1351
+ filters_detail::OperationExecutor<Input> executor_;
1352
+ };
1353
+
1354
+ public:
1434
1355
  // Client: Fetch client initial metadata
1435
1356
  // Returns a promise that resolves to ValueOrFailure<ClientMetadataHandle>
1436
- GRPC_MUST_USE_RESULT auto PullClientInitialMetadata();
1437
- // Server: Indicate that no server initial metadata will be sent
1438
- void NoServerInitialMetadata() {
1439
- server_initial_metadata_state_.CloseSending();
1357
+ GRPC_MUST_USE_RESULT auto PullClientInitialMetadata() {
1358
+ call_state_.BeginPullClientInitialMetadata();
1359
+ return Executor<ClientMetadataHandle, ClientMetadataHandle,
1360
+ &CallFilters::push_client_initial_metadata_,
1361
+ &filters_detail::StackData::client_initial_metadata,
1362
+ &CallState::FinishPullClientInitialMetadata,
1363
+ StacksVector::const_iterator>(this, stacks_.cbegin(),
1364
+ stacks_.cend());
1440
1365
  }
1441
1366
  // Server: Push server initial metadata
1442
1367
  // Returns a promise that resolves to a StatusFlag indicating success
1443
- GRPC_MUST_USE_RESULT auto PushServerInitialMetadata(ServerMetadataHandle md);
1368
+ StatusFlag PushServerInitialMetadata(ServerMetadataHandle md) {
1369
+ push_server_initial_metadata_ = std::move(md);
1370
+ return call_state_.PushServerInitialMetadata();
1371
+ }
1444
1372
  // Client: Fetch server initial metadata
1445
1373
  // Returns a promise that resolves to ValueOrFailure<ServerMetadataHandle>
1446
- GRPC_MUST_USE_RESULT auto PullServerInitialMetadata();
1374
+ GRPC_MUST_USE_RESULT auto PullServerInitialMetadata() {
1375
+ return Seq(
1376
+ [this]() {
1377
+ return call_state_.PollPullServerInitialMetadataAvailable();
1378
+ },
1379
+ [this](bool has_server_initial_metadata) {
1380
+ return If(
1381
+ has_server_initial_metadata,
1382
+ [this]() {
1383
+ return Map(
1384
+ Executor<
1385
+ absl::optional<ServerMetadataHandle>,
1386
+ ServerMetadataHandle,
1387
+ &CallFilters::push_server_initial_metadata_,
1388
+ &filters_detail::StackData::server_initial_metadata,
1389
+ &CallState::FinishPullServerInitialMetadata,
1390
+ StacksVector::const_reverse_iterator>(
1391
+ this, stacks_.crbegin(), stacks_.crend()),
1392
+ [](ValueOrFailure<absl::optional<ServerMetadataHandle>> r) {
1393
+ if (r.ok()) return std::move(*r);
1394
+ return absl::optional<ServerMetadataHandle>{};
1395
+ });
1396
+ },
1397
+ []() {
1398
+ return Immediate(absl::optional<ServerMetadataHandle>{});
1399
+ });
1400
+ });
1401
+ }
1447
1402
  // Client: Push client to server message
1448
1403
  // Returns a promise that resolves to a StatusFlag indicating success
1449
- GRPC_MUST_USE_RESULT auto PushClientToServerMessage(MessageHandle message);
1450
- // Client: Indicate that no more messages will be sent
1451
- void FinishClientToServerSends() {
1452
- client_to_server_message_state_.CloseSending();
1404
+ GRPC_MUST_USE_RESULT auto PushClientToServerMessage(MessageHandle message) {
1405
+ call_state_.BeginPushClientToServerMessage();
1406
+ DCHECK_NE(message.get(), nullptr);
1407
+ DCHECK_EQ(push_client_to_server_message_.get(), nullptr);
1408
+ push_client_to_server_message_ = std::move(message);
1409
+ return [this]() { return call_state_.PollPushClientToServerMessage(); };
1453
1410
  }
1411
+ // Client: Indicate that no more messages will be sent
1412
+ void FinishClientToServerSends() { call_state_.ClientToServerHalfClose(); }
1454
1413
  // Server: Fetch client to server message
1455
1414
  // Returns a promise that resolves to ValueOrFailure<MessageHandle>
1456
- GRPC_MUST_USE_RESULT auto PullClientToServerMessage();
1415
+ GRPC_MUST_USE_RESULT auto PullClientToServerMessage() {
1416
+ return TrySeq(
1417
+ [this]() {
1418
+ return call_state_.PollPullClientToServerMessageAvailable();
1419
+ },
1420
+ [this](bool message_available) {
1421
+ return If(
1422
+ message_available,
1423
+ [this]() {
1424
+ return Executor<
1425
+ absl::optional<MessageHandle>, MessageHandle,
1426
+ &CallFilters::push_client_to_server_message_,
1427
+ &filters_detail::StackData::client_to_server_messages,
1428
+ &CallState::FinishPullClientToServerMessage,
1429
+ StacksVector::const_iterator>(this, stacks_.cbegin(),
1430
+ stacks_.cend());
1431
+ },
1432
+ []() -> ValueOrFailure<absl::optional<MessageHandle>> {
1433
+ return absl::optional<MessageHandle>();
1434
+ });
1435
+ });
1436
+ }
1457
1437
  // Server: Push server to client message
1458
1438
  // Returns a promise that resolves to a StatusFlag indicating success
1459
- GRPC_MUST_USE_RESULT auto PushServerToClientMessage(MessageHandle message);
1439
+ GRPC_MUST_USE_RESULT auto PushServerToClientMessage(MessageHandle message) {
1440
+ call_state_.BeginPushServerToClientMessage();
1441
+ push_server_to_client_message_ = std::move(message);
1442
+ return [this]() { return call_state_.PollPushServerToClientMessage(); };
1443
+ }
1460
1444
  // Server: Fetch server to client message
1461
1445
  // Returns a promise that resolves to ValueOrFailure<MessageHandle>
1462
- GRPC_MUST_USE_RESULT auto PullServerToClientMessage();
1446
+ GRPC_MUST_USE_RESULT auto PullServerToClientMessage() {
1447
+ return TrySeq(
1448
+ [this]() {
1449
+ return call_state_.PollPullServerToClientMessageAvailable();
1450
+ },
1451
+ [this](bool message_available) {
1452
+ return If(
1453
+ message_available,
1454
+ [this]() {
1455
+ return Executor<
1456
+ absl::optional<MessageHandle>, MessageHandle,
1457
+ &CallFilters::push_server_to_client_message_,
1458
+ &filters_detail::StackData::server_to_client_messages,
1459
+ &CallState::FinishPullServerToClientMessage,
1460
+ StacksVector::const_reverse_iterator>(
1461
+ this, stacks_.crbegin(), stacks_.crend());
1462
+ },
1463
+ []() -> ValueOrFailure<absl::optional<MessageHandle>> {
1464
+ return absl::optional<MessageHandle>();
1465
+ });
1466
+ });
1467
+ }
1463
1468
  // Server: Indicate end of response
1464
1469
  // Closes the request entirely - no messages can be sent/received
1465
1470
  // If no server initial metadata has been sent, implies
@@ -1467,489 +1472,61 @@ class CallFilters {
1467
1472
  void PushServerTrailingMetadata(ServerMetadataHandle md);
1468
1473
  // Client: Fetch server trailing metadata
1469
1474
  // Returns a promise that resolves to ServerMetadataHandle
1470
- GRPC_MUST_USE_RESULT auto PullServerTrailingMetadata();
1475
+ GRPC_MUST_USE_RESULT auto PullServerTrailingMetadata() {
1476
+ return Map(
1477
+ [this]() { return call_state_.PollServerTrailingMetadataAvailable(); },
1478
+ [this](Empty) {
1479
+ auto value = std::move(push_server_trailing_metadata_);
1480
+ if (call_data_ != nullptr) {
1481
+ for (auto it = stacks_.crbegin(); it != stacks_.crend(); ++it) {
1482
+ value = filters_detail::RunServerTrailingMetadata(
1483
+ it->stack->data_.server_trailing_metadata,
1484
+ filters_detail::Offset(call_data_, it->call_data_offset),
1485
+ std::move(value));
1486
+ }
1487
+ }
1488
+ call_state_.FinishPullServerTrailingMetadata();
1489
+ return value;
1490
+ });
1491
+ }
1471
1492
  // Server: Wait for server trailing metadata to have been sent
1472
1493
  // Returns a promise that resolves to a StatusFlag indicating whether the
1473
1494
  // request was cancelled or not -- failure to send trailing metadata is
1474
1495
  // considered a cancellation, as is actual cancellation -- but not application
1475
1496
  // errors.
1476
- GRPC_MUST_USE_RESULT auto WasCancelled();
1497
+ GRPC_MUST_USE_RESULT auto WasCancelled() {
1498
+ return [this]() { return call_state_.PollWasCancelled(); };
1499
+ }
1477
1500
  // Client & server: fill in final_info with the final status of the call.
1478
1501
  void Finalize(const grpc_call_final_info* final_info);
1479
1502
 
1480
1503
  std::string DebugString() const;
1481
1504
 
1482
1505
  private:
1483
- template <filters_detail::PipeState(CallFilters::*state_ptr),
1484
- void*(CallFilters::*push_ptr), typename T,
1485
- filters_detail::Layout<filters_detail::FallibleOperator<T>>(
1486
- filters_detail::StackData::*layout_ptr)>
1487
- class PipePromise {
1488
- public:
1489
- class Push {
1490
- public:
1491
- Push(CallFilters* filters, T x)
1492
- : filters_(filters), value_(std::move(x)) {
1493
- CHECK(value_ != nullptr);
1494
- if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) {
1495
- gpr_log(GPR_INFO, "BeginPush[%p|%p]: %s", &state(), this,
1496
- state().DebugString().c_str());
1497
- }
1498
- CHECK_EQ(push_slot(), nullptr);
1499
- state().BeginPush();
1500
- push_slot() = this;
1501
- }
1502
- ~Push() {
1503
- if (filters_ != nullptr) {
1504
- if (value_ != nullptr) {
1505
- state().DropPush();
1506
- }
1507
- CHECK(push_slot() == this);
1508
- push_slot() = nullptr;
1509
- }
1510
- }
1511
-
1512
- Push(const Push&) = delete;
1513
- Push& operator=(const Push&) = delete;
1514
- Push(Push&& other) noexcept
1515
- : filters_(std::exchange(other.filters_, nullptr)),
1516
- value_(std::move(other.value_)) {
1517
- if (filters_ != nullptr) {
1518
- DCHECK(push_slot() == &other);
1519
- push_slot() = this;
1520
- }
1521
- }
1522
-
1523
- Push& operator=(Push&&) = delete;
1524
-
1525
- Poll<StatusFlag> operator()() {
1526
- if (value_ == nullptr) {
1527
- CHECK_EQ(filters_, nullptr);
1528
- if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) {
1529
- gpr_log(GPR_INFO, "Push[|%p]: already done", this);
1530
- }
1531
- return Success{};
1532
- }
1533
- if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) {
1534
- gpr_log(GPR_INFO, "Push[%p|%p]: %s", &state(), this,
1535
- state().DebugString().c_str());
1536
- }
1537
- auto r = state().PollPush();
1538
- if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) {
1539
- if (r.pending()) {
1540
- gpr_log(GPR_INFO, "Push[%p|%p]: pending; %s", &state(), this,
1541
- state().DebugString().c_str());
1542
- } else if (r.value().ok()) {
1543
- gpr_log(GPR_INFO, "Push[%p|%p]: success; %s", &state(), this,
1544
- state().DebugString().c_str());
1545
- } else {
1546
- gpr_log(GPR_INFO, "Push[%p|%p]: failure; %s", &state(), this,
1547
- state().DebugString().c_str());
1548
- }
1549
- }
1550
- if (r.ready()) {
1551
- push_slot() = nullptr;
1552
- filters_ = nullptr;
1553
- }
1554
- return r;
1555
- }
1556
-
1557
- T TakeValue() {
1558
- if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) {
1559
- gpr_log(GPR_INFO, "Push[%p|%p]: take value; %s", &state(), this,
1560
- state().DebugString().c_str());
1561
- }
1562
- CHECK(value_ != nullptr);
1563
- CHECK(filters_ != nullptr);
1564
- push_slot() = nullptr;
1565
- filters_ = nullptr;
1566
- return std::move(value_);
1567
- }
1568
-
1569
- absl::string_view DebugString() const {
1570
- return value_ != nullptr ? " (not pulled)" : "";
1571
- }
1572
-
1573
- private:
1574
- filters_detail::PipeState& state() { return filters_->*state_ptr; }
1575
- void*& push_slot() { return filters_->*push_ptr; }
1576
-
1577
- CallFilters* filters_;
1578
- T value_;
1579
- };
1580
-
1581
- static std::string DebugString(absl::string_view name,
1582
- const CallFilters* filters) {
1583
- auto* push = static_cast<Push*>(filters->*push_ptr);
1584
- return absl::StrCat(name, ":", (filters->*state_ptr).DebugString(),
1585
- push == nullptr ? "" : push->DebugString());
1586
- }
1587
-
1588
- class PullMaybe {
1589
- public:
1590
- explicit PullMaybe(CallFilters* filters) : filters_(filters) {}
1591
- ~PullMaybe() {
1592
- if (filters_ != nullptr) {
1593
- state().DropPull();
1594
- }
1595
- }
1596
-
1597
- PullMaybe(const PullMaybe&) = delete;
1598
- PullMaybe& operator=(const PullMaybe&) = delete;
1599
- PullMaybe(PullMaybe&& other) noexcept
1600
- : filters_(std::exchange(other.filters_, nullptr)),
1601
- executor_(std::move(other.executor_)) {}
1602
- PullMaybe& operator=(PullMaybe&&) = delete;
1603
-
1604
- Poll<ValueOrFailure<absl::optional<T>>> operator()() {
1605
- if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) {
1606
- gpr_log(GPR_INFO, "PullMaybe[%p|%p]: %s executor:%d", &state(), this,
1607
- state().DebugString().c_str(), executor_.IsRunning());
1608
- }
1609
- if (executor_.IsRunning()) {
1610
- auto c = state().PollClosed();
1611
- if (c.ready() && c.value()) {
1612
- filters_->CancelDueToFailedPipeOperation();
1613
- return Failure{};
1614
- }
1615
- return FinishOperationExecutor(executor_.Step(filters_->call_data_));
1616
- }
1617
- auto p = state().PollPull();
1618
- auto* r = p.value_if_ready();
1619
- if (r == nullptr) return Pending{};
1620
- if (!r->ok()) {
1621
- filters_->CancelDueToFailedPipeOperation();
1622
- return Failure{};
1623
- }
1624
- if (!**r) return absl::nullopt;
1625
- return FinishOperationExecutor(executor_.Start(
1626
- layout(), push()->TakeValue(), filters_->call_data_));
1627
- }
1628
-
1629
- private:
1630
- filters_detail::PipeState& state() { return filters_->*state_ptr; }
1631
- Push* push() { return static_cast<Push*>(filters_->*push_ptr); }
1632
- const filters_detail::Layout<filters_detail::FallibleOperator<T>>*
1633
- layout() {
1634
- return &(filters_->stack_->data_.*layout_ptr);
1635
- }
1636
-
1637
- Poll<ValueOrFailure<absl::optional<T>>> FinishOperationExecutor(
1638
- Poll<filters_detail::ResultOr<T>> p) {
1639
- auto* r = p.value_if_ready();
1640
- if (r == nullptr) return Pending{};
1641
- DCHECK(!executor_.IsRunning());
1642
- state().AckPull();
1643
- if (r->ok != nullptr) return std::move(r->ok);
1644
- filters_->PushServerTrailingMetadata(std::move(r->error));
1645
- return Failure{};
1646
- }
1647
-
1648
- CallFilters* filters_;
1649
- filters_detail::OperationExecutor<T> executor_;
1650
- };
1651
-
1652
- template <std::vector<filters_detail::HalfCloseOperator>(
1653
- filters_detail::StackData::*half_close_layout_ptr)>
1654
- class PullMessage {
1655
- public:
1656
- explicit PullMessage(CallFilters* filters) : filters_(filters) {}
1657
- ~PullMessage() {
1658
- if (filters_ != nullptr) {
1659
- state().DropPull();
1660
- }
1661
- }
1662
-
1663
- PullMessage(const PullMessage&) = delete;
1664
- PullMessage& operator=(const PullMessage&) = delete;
1665
- PullMessage(PullMessage&& other) noexcept
1666
- : filters_(std::exchange(other.filters_, nullptr)),
1667
- executor_(std::move(other.executor_)) {}
1668
- PullMessage& operator=(PullMessage&&) = delete;
1669
-
1670
- Poll<ValueOrFailure<absl::optional<MessageHandle>>> operator()() {
1671
- CHECK(filters_ != nullptr);
1672
- if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) {
1673
- gpr_log(GPR_INFO, "PullMessage[%p|%p]: %s executor:%d", &state(),
1674
- this, state().DebugString().c_str(), executor_.IsRunning());
1675
- }
1676
- if (executor_.IsRunning()) {
1677
- auto c = state().PollClosed();
1678
- if (c.ready() && c.value()) {
1679
- filters_->CancelDueToFailedPipeOperation();
1680
- return Failure{};
1681
- }
1682
- return FinishOperationExecutor(executor_.Step(filters_->call_data_));
1683
- }
1684
- auto p = state().PollPull();
1685
- auto* r = p.value_if_ready();
1686
- if (r == nullptr) {
1687
- if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) {
1688
- gpr_log(GPR_INFO, "PullMessage[%p] pending: %s executor:%d",
1689
- &state(), state().DebugString().c_str(),
1690
- executor_.IsRunning());
1691
- }
1692
- return Pending{};
1693
- }
1694
- if (!r->ok()) {
1695
- filters_->CancelDueToFailedPipeOperation();
1696
- return Failure{};
1697
- }
1698
- if (!**r) {
1699
- if (half_close_layout_ptr != nullptr) {
1700
- filters_detail::RunHalfClose(
1701
- filters_->stack_->data_.*half_close_layout_ptr,
1702
- filters_->call_data_);
1703
- }
1704
- return absl::nullopt;
1705
- }
1706
- CHECK(filters_ != nullptr);
1707
- return FinishOperationExecutor(executor_.Start(
1708
- layout(), push()->TakeValue(), filters_->call_data_));
1709
- }
1710
-
1711
- private:
1712
- filters_detail::PipeState& state() { return filters_->*state_ptr; }
1713
- Push* push() { return static_cast<Push*>(filters_->*push_ptr); }
1714
- const filters_detail::Layout<filters_detail::FallibleOperator<T>>*
1715
- layout() {
1716
- return &(filters_->stack_->data_.*layout_ptr);
1717
- }
1718
-
1719
- Poll<ValueOrFailure<absl::optional<MessageHandle>>>
1720
- FinishOperationExecutor(Poll<filters_detail::ResultOr<T>> p) {
1721
- auto* r = p.value_if_ready();
1722
- if (r == nullptr) return Pending{};
1723
- DCHECK(!executor_.IsRunning());
1724
- if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) {
1725
- gpr_log(GPR_INFO, "PullMessage[%p|%p] executor done: %s", &state(),
1726
- this, state().DebugString().c_str());
1727
- }
1728
- state().AckPull();
1729
- if (r->ok != nullptr) return std::move(r->ok);
1730
- filters_->PushServerTrailingMetadata(std::move(r->error));
1731
- return Failure{};
1732
- }
1733
-
1734
- CallFilters* filters_;
1735
- filters_detail::OperationExecutor<T> executor_;
1736
- };
1737
- };
1738
-
1739
- class PullClientInitialMetadataPromise {
1740
- public:
1741
- explicit PullClientInitialMetadataPromise(CallFilters* filters)
1742
- : filters_(filters) {}
1743
-
1744
- PullClientInitialMetadataPromise(const PullClientInitialMetadataPromise&) =
1745
- delete;
1746
- PullClientInitialMetadataPromise& operator=(
1747
- const PullClientInitialMetadataPromise&) = delete;
1748
- PullClientInitialMetadataPromise(
1749
- PullClientInitialMetadataPromise&& other) noexcept
1750
- : filters_(std::exchange(other.filters_, nullptr)),
1751
- executor_(std::move(other.executor_)) {}
1752
- PullClientInitialMetadataPromise& operator=(
1753
- PullClientInitialMetadataPromise&&) = delete;
1754
-
1755
- Poll<ValueOrFailure<ClientMetadataHandle>> operator()() {
1756
- if (executor_.IsRunning()) {
1757
- return FinishOperationExecutor(executor_.Step(filters_->call_data_));
1758
- }
1759
- auto p = state().PollPull();
1760
- auto* r = p.value_if_ready();
1761
- if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) {
1762
- gpr_log(GPR_INFO, "%s",
1763
- r == nullptr
1764
- ? "PENDING"
1765
- : (r->ok() ? (r->value() ? "TRUE" : "FALSE") : "FAILURE"));
1766
- }
1767
- if (r == nullptr) return Pending{};
1768
- if (!r->ok()) {
1769
- filters_->CancelDueToFailedPipeOperation();
1770
- return Failure{};
1771
- }
1772
- CHECK(filters_->client_initial_metadata_ != nullptr);
1773
- return FinishOperationExecutor(executor_.Start(
1774
- &filters_->stack_->data_.client_initial_metadata,
1775
- std::move(filters_->client_initial_metadata_), filters_->call_data_));
1776
- }
1777
-
1778
- private:
1779
- filters_detail::PipeState& state() {
1780
- return filters_->client_initial_metadata_state_;
1781
- }
1782
-
1783
- Poll<ValueOrFailure<ClientMetadataHandle>> FinishOperationExecutor(
1784
- Poll<filters_detail::ResultOr<ClientMetadataHandle>> p) {
1785
- auto* r = p.value_if_ready();
1786
- if (r == nullptr) return Pending{};
1787
- DCHECK(!executor_.IsRunning());
1788
- state().AckPull();
1789
- if (r->ok != nullptr) return std::move(r->ok);
1790
- filters_->PushServerTrailingMetadata(std::move(r->error));
1791
- return Failure{};
1792
- }
1506
+ void CancelDueToFailedPipeOperation(SourceLocation but_where = {});
1793
1507
 
1794
- CallFilters* filters_;
1795
- filters_detail::OperationExecutor<ClientMetadataHandle> executor_;
1508
+ struct AddedStack {
1509
+ explicit AddedStack(RefCountedPtr<Stack> stack)
1510
+ : call_data_offset(std::numeric_limits<size_t>::max()),
1511
+ stack(std::move(stack)) {}
1512
+ size_t call_data_offset;
1513
+ RefCountedPtr<Stack> stack;
1796
1514
  };
1797
1515
 
1798
- class PullServerTrailingMetadataPromise {
1799
- public:
1800
- explicit PullServerTrailingMetadataPromise(CallFilters* filters)
1801
- : filters_(filters) {}
1802
-
1803
- PullServerTrailingMetadataPromise(
1804
- const PullServerTrailingMetadataPromise&) = delete;
1805
- PullServerTrailingMetadataPromise& operator=(
1806
- const PullServerTrailingMetadataPromise&) = delete;
1807
- PullServerTrailingMetadataPromise(
1808
- PullServerTrailingMetadataPromise&& other) noexcept
1809
- : filters_(std::exchange(other.filters_, nullptr)),
1810
- executor_(std::move(other.executor_)) {}
1811
- PullServerTrailingMetadataPromise& operator=(
1812
- PullServerTrailingMetadataPromise&&) = delete;
1813
-
1814
- Poll<ServerMetadataHandle> operator()() {
1815
- if (executor_.IsRunning()) {
1816
- auto r = executor_.Step(filters_->call_data_);
1817
- if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) {
1818
- if (r.pending()) {
1819
- gpr_log(GPR_INFO,
1820
- "%s PullServerTrailingMetadata[%p]: Pending(but executing)",
1821
- GetContext<Activity>()->DebugTag().c_str(), filters_);
1822
- } else {
1823
- gpr_log(GPR_INFO, "%s PullServerTrailingMetadata[%p]: Ready: %s",
1824
- GetContext<Activity>()->DebugTag().c_str(), filters_,
1825
- r.value()->DebugString().c_str());
1826
- }
1827
- }
1828
- return r;
1829
- }
1830
- if (filters_->server_trailing_metadata_ == nullptr) {
1831
- if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) {
1832
- gpr_log(GPR_INFO,
1833
- "%s PullServerTrailingMetadata[%p]: Pending(not pushed)",
1834
- GetContext<Activity>()->DebugTag().c_str(), filters_);
1835
- }
1836
- return filters_->server_trailing_metadata_waiter_.pending();
1837
- }
1838
- // If no stack has been set, we can just return the result of the call
1839
- if (filters_->stack_ == nullptr) {
1840
- if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) {
1841
- gpr_log(GPR_INFO,
1842
- "%s PullServerTrailingMetadata[%p]: Ready(no-stack): %s",
1843
- GetContext<Activity>()->DebugTag().c_str(), filters_,
1844
- filters_->server_trailing_metadata_->DebugString().c_str());
1845
- }
1846
- return std::move(filters_->server_trailing_metadata_);
1847
- }
1848
- // Otherwise we need to process it through all the filters.
1849
- auto r = executor_.Start(
1850
- &filters_->stack_->data_.server_trailing_metadata,
1851
- std::move(filters_->server_trailing_metadata_), filters_->call_data_);
1852
- if (GRPC_TRACE_FLAG_ENABLED(promise_primitives)) {
1853
- if (r.pending()) {
1854
- gpr_log(GPR_INFO,
1855
- "%s PullServerTrailingMetadata[%p]: Pending(but executing)",
1856
- GetContext<Activity>()->DebugTag().c_str(), filters_);
1857
- } else {
1858
- gpr_log(GPR_INFO, "%s PullServerTrailingMetadata[%p]: Ready: %s",
1859
- GetContext<Activity>()->DebugTag().c_str(), filters_,
1860
- r.value()->DebugString().c_str());
1861
- }
1862
- }
1863
- return r;
1864
- }
1516
+ using StacksVector = absl::InlinedVector<AddedStack, 2>;
1865
1517
 
1866
- private:
1867
- CallFilters* filters_;
1868
- filters_detail::InfallibleOperationExecutor<ServerMetadataHandle> executor_;
1869
- };
1870
-
1871
- void CancelDueToFailedPipeOperation(SourceLocation but_where = {});
1518
+ StacksVector stacks_;
1872
1519
 
1873
- RefCountedPtr<Stack> stack_;
1874
-
1875
- filters_detail::PipeState client_initial_metadata_state_{
1876
- filters_detail::PipeState::StartPushed{}};
1877
- filters_detail::PipeState server_initial_metadata_state_;
1878
- filters_detail::PipeState client_to_server_message_state_;
1879
- filters_detail::PipeState server_to_client_message_state_;
1880
- IntraActivityWaiter server_trailing_metadata_waiter_;
1881
- Latch<bool> cancelled_;
1520
+ CallState call_state_;
1882
1521
 
1883
1522
  void* call_data_;
1884
- ClientMetadataHandle client_initial_metadata_;
1885
-
1886
- // The following void*'s are pointers to a `Push` object (from above).
1887
- // They are used to track the current push operation for each pipe.
1888
- // It would be lovely for them to be typed pointers, but that would require
1889
- // a recursive type definition since the location of this field needs to be
1890
- // a template argument to the `Push` object itself.
1891
- void* server_initial_metadata_push_ = nullptr;
1892
- void* client_to_server_message_push_ = nullptr;
1893
- void* server_to_client_message_push_ = nullptr;
1894
-
1895
- ServerMetadataHandle server_trailing_metadata_;
1896
-
1897
- using ServerInitialMetadataPromises =
1898
- PipePromise<&CallFilters::server_initial_metadata_state_,
1899
- &CallFilters::server_initial_metadata_push_,
1900
- ServerMetadataHandle,
1901
- &filters_detail::StackData::server_initial_metadata>;
1902
- using ClientToServerMessagePromises =
1903
- PipePromise<&CallFilters::client_to_server_message_state_,
1904
- &CallFilters::client_to_server_message_push_, MessageHandle,
1905
- &filters_detail::StackData::client_to_server_messages>;
1906
- using ServerToClientMessagePromises =
1907
- PipePromise<&CallFilters::server_to_client_message_state_,
1908
- &CallFilters::server_to_client_message_push_, MessageHandle,
1909
- &filters_detail::StackData::server_to_client_messages>;
1523
+ ClientMetadataHandle push_client_initial_metadata_;
1524
+ ServerMetadataHandle push_server_initial_metadata_;
1525
+ MessageHandle push_client_to_server_message_;
1526
+ MessageHandle push_server_to_client_message_;
1527
+ ServerMetadataHandle push_server_trailing_metadata_;
1910
1528
  };
1911
1529
 
1912
- inline auto CallFilters::PullClientInitialMetadata() {
1913
- return PullClientInitialMetadataPromise(this);
1914
- }
1915
-
1916
- inline auto CallFilters::PushServerInitialMetadata(ServerMetadataHandle md) {
1917
- CHECK(md != nullptr);
1918
- return [p = ServerInitialMetadataPromises::Push{
1919
- this, std::move(md)}]() mutable { return p(); };
1920
- }
1921
-
1922
- inline auto CallFilters::PullServerInitialMetadata() {
1923
- return ServerInitialMetadataPromises::PullMaybe{this};
1924
- }
1925
-
1926
- inline auto CallFilters::PushClientToServerMessage(MessageHandle message) {
1927
- CHECK(message != nullptr);
1928
- return [p = ClientToServerMessagePromises::Push{
1929
- this, std::move(message)}]() mutable { return p(); };
1930
- }
1931
-
1932
- inline auto CallFilters::PullClientToServerMessage() {
1933
- return ClientToServerMessagePromises::PullMessage<
1934
- &filters_detail::StackData::client_to_server_half_close>{this};
1935
- }
1936
-
1937
- inline auto CallFilters::PushServerToClientMessage(MessageHandle message) {
1938
- CHECK(message != nullptr);
1939
- return [p = ServerToClientMessagePromises::Push{
1940
- this, std::move(message)}]() mutable { return p(); };
1941
- }
1942
-
1943
- inline auto CallFilters::PullServerToClientMessage() {
1944
- return ServerToClientMessagePromises::PullMessage<nullptr>{this};
1945
- }
1946
-
1947
- inline auto CallFilters::PullServerTrailingMetadata() {
1948
- return PullServerTrailingMetadataPromise(this);
1949
- }
1950
-
1951
- inline auto CallFilters::WasCancelled() { return cancelled_.Wait(); }
1952
-
1953
1530
  } // namespace grpc_core
1954
1531
 
1955
1532
  #endif // GRPC_SRC_CORE_LIB_TRANSPORT_CALL_FILTERS_H