grpc 1.45.0 → 1.46.2

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

Potentially problematic release.


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

Files changed (513) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +36 -29
  3. data/include/grpc/impl/codegen/grpc_types.h +7 -13
  4. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +309 -0
  5. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +122 -0
  6. data/src/core/ext/filters/{client_idle → channel_idle}/idle_filter_state.cc +1 -1
  7. data/src/core/ext/filters/{client_idle → channel_idle}/idle_filter_state.h +3 -3
  8. data/src/core/ext/filters/client_channel/client_channel.cc +163 -96
  9. data/src/core/ext/filters/client_channel/client_channel.h +2 -0
  10. data/src/core/ext/filters/client_channel/health/health_check_client.cc +124 -581
  11. data/src/core/ext/filters/client_channel/health/health_check_client.h +24 -160
  12. data/src/core/ext/filters/client_channel/http_proxy.cc +88 -110
  13. data/src/core/ext/filters/client_channel/http_proxy.h +17 -0
  14. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +182 -142
  15. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -6
  16. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +1 -10
  17. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +87 -58
  18. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +51 -48
  19. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +14 -7
  20. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +229 -284
  21. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +92 -257
  22. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +51 -221
  23. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +201 -0
  24. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +106 -0
  25. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +102 -55
  26. data/src/core/ext/filters/client_channel/retry_filter.cc +18 -3
  27. data/src/core/ext/filters/client_channel/subchannel.cc +5 -5
  28. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +544 -0
  29. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +214 -0
  30. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +127 -367
  31. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +24 -1
  32. data/src/core/ext/filters/http/client/http_client_filter.cc +78 -458
  33. data/src/core/ext/filters/http/client/http_client_filter.h +21 -4
  34. data/src/core/ext/filters/http/client_authority_filter.cc +17 -22
  35. data/src/core/ext/filters/http/client_authority_filter.h +6 -5
  36. data/src/core/ext/filters/http/http_filters_plugin.cc +9 -6
  37. data/src/core/ext/filters/http/server/http_server_filter.cc +2 -116
  38. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +2 -8
  39. data/src/core/ext/filters/server_config_selector/server_config_selector.h +2 -2
  40. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +73 -201
  41. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -1
  42. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +5 -4
  43. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +139 -28
  44. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -0
  45. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +2 -6
  46. data/src/core/ext/transport/chttp2/transport/internal.h +4 -2
  47. data/src/core/ext/transport/chttp2/transport/parsing.cc +8 -0
  48. data/src/core/ext/transport/chttp2/transport/writing.cc +24 -13
  49. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.c +27 -24
  50. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.h +143 -63
  51. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.c +37 -35
  52. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.h +177 -77
  53. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +115 -111
  54. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +547 -207
  55. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.c +5 -5
  56. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.h +26 -13
  57. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.c +5 -5
  58. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.h +23 -9
  59. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.c +7 -7
  60. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.h +18 -0
  61. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.c +4 -4
  62. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.h +13 -4
  63. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.c +4 -4
  64. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.h +9 -0
  65. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.c +49 -46
  66. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.h +217 -78
  67. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.c +3 -3
  68. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.h +10 -2
  69. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +12 -12
  70. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +40 -8
  71. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +5 -5
  72. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +20 -2
  73. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +55 -55
  74. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +289 -110
  75. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +133 -125
  76. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +656 -267
  77. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +24 -18
  78. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +96 -23
  79. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +185 -173
  80. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +860 -309
  81. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +3 -3
  82. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +10 -2
  83. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +44 -24
  84. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +165 -40
  85. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.c +72 -63
  86. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.h +433 -174
  87. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +33 -31
  88. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +154 -52
  89. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +5 -4
  90. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +14 -4
  91. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +89 -89
  92. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +460 -166
  93. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +76 -33
  94. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +379 -69
  95. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +2 -2
  96. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +14 -6
  97. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +5 -25
  98. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +10 -91
  99. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.c +5 -5
  100. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.h +26 -13
  101. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +70 -68
  102. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +369 -131
  103. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +94 -65
  104. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +447 -161
  105. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +4 -4
  106. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +27 -11
  107. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +104 -85
  108. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +378 -113
  109. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +2 -2
  110. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +3 -0
  111. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +6 -6
  112. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +30 -13
  113. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +7 -7
  114. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +43 -16
  115. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +8 -8
  116. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +58 -24
  117. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +4 -4
  118. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +14 -4
  119. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +18 -18
  120. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +100 -43
  121. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +31 -30
  122. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +171 -71
  123. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +32 -32
  124. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +196 -95
  125. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +2 -2
  126. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +7 -2
  127. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +53 -46
  128. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +284 -129
  129. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +56 -50
  130. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +337 -146
  131. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +13 -11
  132. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +49 -14
  133. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +4 -4
  134. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +14 -4
  135. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c +5 -5
  136. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.h +20 -4
  137. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +33 -32
  138. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +205 -86
  139. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +34 -34
  140. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +175 -74
  141. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +56 -52
  142. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +370 -146
  143. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +27 -23
  144. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +173 -74
  145. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +362 -341
  146. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +2056 -845
  147. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +11 -11
  148. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +49 -16
  149. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.c +56 -50
  150. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.h +293 -111
  151. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.c +3 -3
  152. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.h +6 -0
  153. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.c +3 -3
  154. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.h +10 -2
  155. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +5 -5
  156. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +26 -10
  157. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.c +5 -5
  158. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.h +27 -12
  159. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.c +17 -16
  160. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.h +83 -36
  161. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.c +2 -2
  162. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.h +7 -2
  163. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.c +8 -8
  164. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.h +46 -17
  165. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.c +9 -9
  166. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.h +38 -12
  167. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.c +7 -7
  168. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.h +30 -10
  169. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +2 -2
  170. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +10 -6
  171. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +15 -15
  172. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +71 -28
  173. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +25 -25
  174. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +149 -65
  175. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +8 -7
  176. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +30 -12
  177. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +9 -9
  178. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +42 -15
  179. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +173 -144
  180. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +898 -323
  181. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +51 -45
  182. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +261 -116
  183. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +13 -13
  184. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +70 -25
  185. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +80 -55
  186. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +410 -124
  187. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.c +5 -5
  188. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.h +23 -9
  189. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
  190. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +44 -44
  191. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +261 -122
  192. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +8 -8
  193. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +47 -21
  194. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +32 -32
  195. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +175 -66
  196. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.c +4 -4
  197. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.h +17 -6
  198. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +8 -8
  199. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +38 -17
  200. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c +8 -8
  201. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.h +12 -0
  202. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +7 -7
  203. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +43 -18
  204. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +3 -3
  205. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +20 -9
  206. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +3 -3
  207. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +24 -9
  208. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +2 -2
  209. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +14 -6
  210. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +8 -8
  211. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +40 -16
  212. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +9 -9
  213. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +70 -25
  214. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +5 -5
  215. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +37 -18
  216. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +12 -12
  217. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +81 -30
  218. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +16 -16
  219. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +76 -30
  220. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +20 -20
  221. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +90 -30
  222. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.c +7 -7
  223. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.h +28 -10
  224. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.c +2 -2
  225. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.h +3 -0
  226. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +5 -5
  227. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +13 -4
  228. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +9 -9
  229. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +18 -0
  230. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +4 -4
  231. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +9 -0
  232. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.c +5 -5
  233. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.h +17 -4
  234. data/src/core/ext/upb-generated/google/api/annotations.upb.c +3 -3
  235. data/src/core/ext/upb-generated/google/api/annotations.upb.h +17 -2
  236. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +70 -66
  237. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +410 -162
  238. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +80 -74
  239. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +440 -158
  240. data/src/core/ext/upb-generated/google/api/http.upb.c +17 -17
  241. data/src/core/ext/upb-generated/google/api/http.upb.h +116 -43
  242. data/src/core/ext/upb-generated/google/api/httpbody.upb.c +4 -4
  243. data/src/core/ext/upb-generated/google/api/httpbody.upb.h +19 -7
  244. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +3 -3
  245. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +6 -0
  246. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +163 -162
  247. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +1157 -435
  248. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +3 -3
  249. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +10 -4
  250. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
  251. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +15 -15
  252. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +108 -40
  253. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +3 -3
  254. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +10 -4
  255. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +18 -18
  256. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +27 -0
  257. data/src/core/ext/upb-generated/google/rpc/status.upb.c +4 -4
  258. data/src/core/ext/upb-generated/google/rpc/status.upb.h +19 -7
  259. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.c +15 -15
  260. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.h +65 -22
  261. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +12 -12
  262. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +49 -12
  263. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +69 -65
  264. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +364 -149
  265. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +8 -7
  266. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +20 -4
  267. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +4 -4
  268. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +6 -0
  269. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +31 -31
  270. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +150 -58
  271. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +11 -11
  272. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +51 -18
  273. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c +175 -0
  274. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h +764 -0
  275. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +22 -22
  276. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +97 -10
  277. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +6 -6
  278. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +23 -2
  279. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +3 -3
  280. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +10 -2
  281. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +6 -6
  282. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +27 -6
  283. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +5 -5
  284. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +20 -2
  285. data/src/core/ext/upb-generated/validate/validate.upb.c +261 -250
  286. data/src/core/ext/upb-generated/validate/validate.upb.h +1836 -663
  287. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.c +22 -22
  288. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.h +97 -10
  289. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.c +6 -6
  290. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.h +23 -2
  291. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.c +3 -3
  292. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.h +10 -2
  293. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +18 -18
  294. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +70 -10
  295. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.c +5 -5
  296. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.h +20 -2
  297. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +2 -2
  298. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +3 -0
  299. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +8 -8
  300. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +38 -12
  301. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +5 -5
  302. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +27 -10
  303. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.c +3 -3
  304. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.h +10 -2
  305. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +5 -5
  306. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +21 -8
  307. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +10 -10
  308. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +71 -30
  309. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +5 -5
  310. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +16 -2
  311. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +12 -12
  312. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +69 -26
  313. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.c +43 -39
  314. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.h +255 -103
  315. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.c +4 -4
  316. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.h +19 -8
  317. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.c +9 -9
  318. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.h +70 -25
  319. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +3 -3
  320. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +10 -2
  321. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +50 -46
  322. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +195 -185
  323. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +16 -12
  324. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +129 -94
  325. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +10 -0
  326. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +18 -33
  327. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +0 -5
  328. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +163 -155
  329. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +5 -0
  330. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +141 -138
  331. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +26 -20
  332. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +738 -730
  333. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +271 -251
  334. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +5 -0
  335. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +207 -193
  336. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +5 -0
  337. data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c +99 -0
  338. data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h +75 -0
  339. data/src/core/ext/xds/certificate_provider_store.cc +8 -0
  340. data/src/core/ext/xds/certificate_provider_store.h +9 -0
  341. data/src/core/ext/xds/xds_api.cc +20 -0
  342. data/src/core/ext/xds/xds_certificate_provider.cc +2 -0
  343. data/src/core/ext/xds/xds_certificate_provider.h +8 -0
  344. data/src/core/ext/xds/xds_client.cc +83 -93
  345. data/src/core/ext/xds/xds_client.h +11 -4
  346. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +142 -0
  347. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +79 -0
  348. data/src/core/ext/xds/xds_common_types.cc +9 -9
  349. data/src/core/ext/xds/xds_common_types.h +3 -3
  350. data/src/core/ext/xds/xds_endpoint.cc +12 -5
  351. data/src/core/ext/xds/xds_http_fault_filter.cc +1 -1
  352. data/src/core/ext/xds/xds_listener.cc +1 -1
  353. data/src/core/ext/xds/xds_route_config.cc +162 -25
  354. data/src/core/ext/xds/xds_route_config.h +13 -10
  355. data/src/core/ext/xds/xds_server_config_fetcher.cc +17 -22
  356. data/src/core/lib/avl/avl.h +68 -5
  357. data/src/core/lib/channel/call_tracer.h +4 -1
  358. data/src/core/lib/channel/channel_args.cc +138 -59
  359. data/src/core/lib/channel/channel_args.h +210 -9
  360. data/src/core/lib/channel/channel_args_preconditioning.cc +3 -9
  361. data/src/core/lib/channel/channel_args_preconditioning.h +1 -2
  362. data/src/core/lib/channel/channel_stack.h +2 -5
  363. data/src/core/lib/channel/channel_stack_builder.cc +0 -65
  364. data/src/core/lib/channel/channel_stack_builder.h +27 -6
  365. data/src/core/lib/channel/channel_stack_builder_impl.cc +102 -0
  366. data/src/core/lib/channel/channel_stack_builder_impl.h +48 -0
  367. data/src/core/lib/channel/connected_channel.h +1 -0
  368. data/src/core/lib/channel/promise_based_filter.cc +495 -162
  369. data/src/core/lib/channel/promise_based_filter.h +55 -41
  370. data/src/core/lib/compression/compression_internal.cc +1 -7
  371. data/src/core/lib/debug/stats_data.cc +2 -6
  372. data/src/core/lib/debug/stats_data.h +18 -21
  373. data/src/core/lib/gpr/tls.h +1 -0
  374. data/src/core/lib/gprpp/bitset.h +12 -0
  375. data/src/core/lib/gprpp/cpp_impl_of.h +4 -0
  376. data/src/core/lib/gprpp/match.h +73 -0
  377. data/src/core/lib/gprpp/overload.h +59 -0
  378. data/src/core/lib/gprpp/ref_counted.h +2 -0
  379. data/src/core/lib/gprpp/single_set_ptr.h +87 -0
  380. data/src/core/lib/gprpp/status_helper.cc +18 -2
  381. data/src/core/lib/gprpp/time.cc +12 -0
  382. data/src/core/lib/gprpp/time.h +1 -1
  383. data/src/core/lib/http/format_request.cc +1 -2
  384. data/src/core/lib/http/httpcli_security_connector.cc +5 -5
  385. data/src/core/lib/http/parser.cc +80 -9
  386. data/src/core/lib/http/parser.h +14 -1
  387. data/src/core/lib/iomgr/ev_posix.cc +6 -7
  388. data/src/core/lib/iomgr/fork_posix.cc +1 -1
  389. data/src/core/lib/iomgr/port.h +0 -2
  390. data/src/core/lib/iomgr/tcp_client_posix.cc +2 -2
  391. data/src/core/lib/iomgr/tcp_posix.cc +93 -35
  392. data/src/core/lib/iomgr/tcp_server_posix.cc +26 -17
  393. data/src/core/lib/json/json_util.h +3 -3
  394. data/src/core/lib/promise/call_push_pull.h +144 -0
  395. data/src/core/lib/promise/detail/status.h +2 -1
  396. data/src/core/lib/promise/intra_activity_waiter.h +49 -0
  397. data/src/core/lib/promise/latch.h +104 -0
  398. data/src/core/lib/resource_quota/api.cc +5 -30
  399. data/src/core/lib/resource_quota/api.h +1 -1
  400. data/src/core/lib/resource_quota/resource_quota.h +8 -0
  401. data/src/core/lib/security/authorization/authorization_policy_provider.h +7 -0
  402. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +9 -12
  403. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +5 -6
  404. data/src/core/lib/security/context/security_context.h +8 -1
  405. data/src/core/lib/security/credentials/alts/alts_credentials.cc +6 -5
  406. data/src/core/lib/security/credentials/alts/alts_credentials.h +4 -0
  407. data/src/core/lib/security/credentials/call_creds_util.cc +3 -3
  408. data/src/core/lib/security/credentials/call_creds_util.h +2 -2
  409. data/src/core/lib/security/credentials/composite/composite_credentials.cc +15 -10
  410. data/src/core/lib/security/credentials/composite/composite_credentials.h +9 -8
  411. data/src/core/lib/security/credentials/credentials.h +16 -33
  412. data/src/core/lib/security/credentials/fake/fake_credentials.cc +8 -12
  413. data/src/core/lib/security/credentials/fake/fake_credentials.h +8 -5
  414. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +4 -0
  415. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +3 -3
  416. data/src/core/lib/security/credentials/iam/iam_credentials.cc +5 -4
  417. data/src/core/lib/security/credentials/iam/iam_credentials.h +6 -2
  418. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +22 -29
  419. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +57 -0
  420. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +7 -3
  421. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +6 -2
  422. data/src/core/lib/security/credentials/local/local_credentials.cc +6 -6
  423. data/src/core/lib/security/credentials/local/local_credentials.h +4 -0
  424. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +17 -9
  425. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +14 -6
  426. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +8 -6
  427. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +8 -6
  428. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +6 -4
  429. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +8 -0
  430. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +49 -0
  431. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +8 -0
  432. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +42 -3
  433. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +66 -95
  434. data/src/core/lib/security/credentials/tls/tls_credentials.cc +9 -6
  435. data/src/core/lib/security/credentials/tls/tls_credentials.h +5 -5
  436. data/src/core/lib/security/credentials/xds/xds_credentials.cc +48 -50
  437. data/src/core/lib/security/credentials/xds/xds_credentials.h +31 -5
  438. data/src/core/lib/security/security_connector/local/local_security_connector.cc +2 -2
  439. data/src/core/lib/security/security_connector/security_connector.h +9 -0
  440. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +4 -2
  441. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -2
  442. data/src/core/lib/security/transport/auth_filters.h +7 -7
  443. data/src/core/lib/security/transport/client_auth_filter.cc +28 -20
  444. data/src/core/lib/security/transport/secure_endpoint.cc +198 -129
  445. data/src/core/lib/security/transport/secure_endpoint.h +1 -1
  446. data/src/core/lib/security/transport/security_handshaker.cc +6 -4
  447. data/src/core/lib/surface/call.cc +1023 -903
  448. data/src/core/lib/surface/call.h +0 -14
  449. data/src/core/lib/surface/channel.cc +4 -3
  450. data/src/core/lib/surface/channel_init.cc +2 -3
  451. data/src/core/lib/surface/channel_init.h +2 -6
  452. data/src/core/lib/surface/init.cc +1 -1
  453. data/src/core/lib/surface/server.cc +3 -14
  454. data/src/core/lib/surface/server.h +1 -2
  455. data/src/core/lib/surface/version.cc +2 -2
  456. data/src/core/lib/transport/byte_stream.cc +2 -0
  457. data/src/core/lib/transport/metadata_batch.h +12 -8
  458. data/src/core/lib/transport/transport.h +20 -5
  459. data/src/core/lib/transport/transport_impl.h +4 -3
  460. data/src/core/plugin_registry/grpc_plugin_registry.cc +2 -4
  461. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +2 -2
  462. data/src/core/tsi/ssl_transport_security.cc +75 -38
  463. data/src/core/tsi/ssl_transport_security.h +8 -2
  464. data/src/core/tsi/transport_security_interface.h +2 -0
  465. data/src/ruby/ext/grpc/extconf.rb +1 -1
  466. data/src/ruby/lib/grpc/generic/active_call.rb +7 -1
  467. data/src/ruby/lib/grpc/grpc.rb +1 -1
  468. data/src/ruby/lib/grpc/version.rb +1 -1
  469. data/src/ruby/pb/generate_proto_ruby.sh +1 -0
  470. data/src/ruby/pb/test/client.rb +769 -0
  471. data/src/ruby/pb/test/server.rb +252 -0
  472. data/src/ruby/pb/test/xds_client.rb +415 -0
  473. data/third_party/upb/third_party/utf8_range/utf8_range.h +1 -1
  474. data/third_party/upb/upb/decode.c +32 -16
  475. data/third_party/upb/upb/def.c +118 -55
  476. data/third_party/upb/upb/def.h +12 -3
  477. data/third_party/upb/upb/encode.c +14 -8
  478. data/third_party/upb/upb/json_encode.c +776 -0
  479. data/third_party/upb/upb/json_encode.h +62 -0
  480. data/third_party/upb/upb/msg.c +5 -7
  481. data/third_party/upb/upb/msg.h +1 -2
  482. data/third_party/upb/upb/msg_internal.h +49 -36
  483. data/third_party/upb/upb/port_def.inc +8 -0
  484. data/third_party/upb/upb/port_undef.inc +1 -0
  485. data/third_party/upb/upb/table.c +10 -6
  486. data/third_party/upb/upb/table_internal.h +2 -0
  487. data/third_party/upb/upb/upb.h +41 -11
  488. data/third_party/zlib/crc32.c +966 -292
  489. data/third_party/zlib/crc32.h +9441 -436
  490. data/third_party/zlib/deflate.c +78 -30
  491. data/third_party/zlib/deflate.h +12 -15
  492. data/third_party/zlib/gzguts.h +3 -2
  493. data/third_party/zlib/gzlib.c +5 -3
  494. data/third_party/zlib/gzread.c +5 -7
  495. data/third_party/zlib/gzwrite.c +25 -13
  496. data/third_party/zlib/infback.c +2 -1
  497. data/third_party/zlib/inffast.c +14 -14
  498. data/third_party/zlib/inflate.c +39 -8
  499. data/third_party/zlib/inflate.h +3 -2
  500. data/third_party/zlib/inftrees.c +3 -3
  501. data/third_party/zlib/trees.c +27 -48
  502. data/third_party/zlib/zlib.h +123 -100
  503. data/third_party/zlib/zutil.c +2 -2
  504. data/third_party/zlib/zutil.h +12 -9
  505. metadata +66 -45
  506. data/src/core/ext/filters/client_idle/client_idle_filter.cc +0 -201
  507. data/src/core/ext/filters/max_age/max_age_filter.cc +0 -566
  508. data/src/core/ext/filters/max_age/max_age_filter.h +0 -26
  509. data/src/core/lib/iomgr/ev_epollex_linux.cc +0 -1657
  510. data/src/core/lib/iomgr/ev_epollex_linux.h +0 -30
  511. data/src/core/lib/iomgr/is_epollexclusive_available.cc +0 -119
  512. data/src/core/lib/iomgr/is_epollexclusive_available.h +0 -36
  513. data/src/core/lib/iomgr/sys_epoll_wrapper.h +0 -30
@@ -16,6 +16,8 @@
16
16
 
17
17
  #include "src/core/lib/channel/promise_based_filter.h"
18
18
 
19
+ #include <cstdlib>
20
+
19
21
  #include "src/core/lib/channel/channel_stack.h"
20
22
 
21
23
  namespace grpc_core {
@@ -24,6 +26,25 @@ namespace promise_filter_detail {
24
26
  ///////////////////////////////////////////////////////////////////////////////
25
27
  // BaseCallData
26
28
 
29
+ BaseCallData::BaseCallData(grpc_call_element* elem,
30
+ const grpc_call_element_args* args, uint8_t flags)
31
+ : call_stack_(args->call_stack),
32
+ elem_(elem),
33
+ arena_(args->arena),
34
+ call_combiner_(args->call_combiner),
35
+ deadline_(args->deadline),
36
+ context_(args->context) {
37
+ if (flags & kFilterExaminesServerInitialMetadata) {
38
+ server_initial_metadata_latch_ = arena_->New<Latch<ServerMetadata*>>();
39
+ }
40
+ }
41
+
42
+ BaseCallData::~BaseCallData() {
43
+ if (server_initial_metadata_latch_ != nullptr) {
44
+ server_initial_metadata_latch_->~Latch();
45
+ }
46
+ }
47
+
27
48
  // We don't form ActivityPtr's to this type, and consequently don't need
28
49
  // Orphan().
29
50
  void BaseCallData::Orphan() { abort(); }
@@ -52,23 +73,323 @@ void BaseCallData::Drop() { GRPC_CALL_STACK_UNREF(call_stack_, "waker"); }
52
73
  ///////////////////////////////////////////////////////////////////////////////
53
74
  // ClientCallData
54
75
 
76
+ struct ClientCallData::RecvInitialMetadata final {
77
+ enum State {
78
+ // Initial state; no op seen
79
+ kInitial,
80
+ // No op seen, but we have a latch that would like to modify it when we do
81
+ kGotLatch,
82
+ // Responded to trailing metadata prior to getting a recv_initial_metadata
83
+ kRespondedToTrailingMetadataPriorToHook,
84
+ // Hooked, no latch yet
85
+ kHookedWaitingForLatch,
86
+ // Hooked, latch seen
87
+ kHookedAndGotLatch,
88
+ // Got the callback, haven't set latch yet
89
+ kCompleteWaitingForLatch,
90
+ // Got the callback and got the latch
91
+ kCompleteAndGotLatch,
92
+ // Got the callback and set the latch
93
+ kCompleteAndSetLatch,
94
+ // Called the original callback
95
+ kResponded,
96
+ };
97
+
98
+ State state = kInitial;
99
+ grpc_closure* original_on_ready = nullptr;
100
+ grpc_closure on_ready;
101
+ grpc_metadata_batch* metadata = nullptr;
102
+ Latch<ServerMetadata*>* server_initial_metadata_publisher = nullptr;
103
+ };
104
+
105
+ class ClientCallData::PollContext {
106
+ public:
107
+ explicit PollContext(ClientCallData* self) : self_(self) {
108
+ GPR_ASSERT(self_->poll_ctx_ == nullptr);
109
+ self_->poll_ctx_ = this;
110
+ scoped_activity_.Init(self_);
111
+ have_scoped_activity_ = true;
112
+ }
113
+
114
+ PollContext(const PollContext&) = delete;
115
+ PollContext& operator=(const PollContext&) = delete;
116
+
117
+ void Run() {
118
+ GPR_ASSERT(have_scoped_activity_);
119
+ repoll_ = false;
120
+ if (self_->server_initial_metadata_latch() != nullptr) {
121
+ switch (self_->recv_initial_metadata_->state) {
122
+ case RecvInitialMetadata::kInitial:
123
+ case RecvInitialMetadata::kGotLatch:
124
+ case RecvInitialMetadata::kHookedWaitingForLatch:
125
+ case RecvInitialMetadata::kHookedAndGotLatch:
126
+ case RecvInitialMetadata::kCompleteWaitingForLatch:
127
+ case RecvInitialMetadata::kResponded:
128
+ case RecvInitialMetadata::kRespondedToTrailingMetadataPriorToHook:
129
+ break;
130
+ case RecvInitialMetadata::kCompleteAndGotLatch:
131
+ self_->recv_initial_metadata_->state =
132
+ RecvInitialMetadata::kCompleteAndSetLatch;
133
+ self_->recv_initial_metadata_->server_initial_metadata_publisher->Set(
134
+ self_->recv_initial_metadata_->metadata);
135
+ ABSL_FALLTHROUGH_INTENDED;
136
+ case RecvInitialMetadata::kCompleteAndSetLatch: {
137
+ Poll<ServerMetadata**> p =
138
+ self_->server_initial_metadata_latch()->Wait()();
139
+ if (ServerMetadata*** ppp = absl::get_if<ServerMetadata**>(&p)) {
140
+ ServerMetadata* md = **ppp;
141
+ if (self_->recv_initial_metadata_->metadata != md) {
142
+ *self_->recv_initial_metadata_->metadata = std::move(*md);
143
+ }
144
+ self_->recv_initial_metadata_->state =
145
+ RecvInitialMetadata::kResponded;
146
+ call_closures_.Add(
147
+ absl::exchange(self_->recv_initial_metadata_->original_on_ready,
148
+ nullptr),
149
+ GRPC_ERROR_NONE,
150
+ "wake_inside_combiner:recv_initial_metadata_ready");
151
+ }
152
+ } break;
153
+ }
154
+ }
155
+ if (self_->recv_trailing_state_ == RecvTrailingState::kCancelled ||
156
+ self_->recv_trailing_state_ == RecvTrailingState::kResponded) {
157
+ return;
158
+ }
159
+ switch (self_->send_initial_state_) {
160
+ case SendInitialState::kQueued:
161
+ case SendInitialState::kForwarded: {
162
+ // Poll the promise once since we're waiting for it.
163
+ Poll<ServerMetadataHandle> poll = self_->promise_();
164
+ if (auto* r = absl::get_if<ServerMetadataHandle>(&poll)) {
165
+ auto* md = UnwrapMetadata(std::move(*r));
166
+ bool destroy_md = true;
167
+ if (self_->recv_trailing_state_ == RecvTrailingState::kComplete) {
168
+ if (self_->recv_trailing_metadata_ != md) {
169
+ *self_->recv_trailing_metadata_ = std::move(*md);
170
+ } else {
171
+ destroy_md = false;
172
+ }
173
+ self_->recv_trailing_state_ = RecvTrailingState::kResponded;
174
+ call_closures_.Add(
175
+ absl::exchange(self_->original_recv_trailing_metadata_ready_,
176
+ nullptr),
177
+ GRPC_ERROR_NONE, "wake_inside_combiner:recv_trailing_ready:1");
178
+ if (self_->recv_initial_metadata_ != nullptr) {
179
+ switch (self_->recv_initial_metadata_->state) {
180
+ case RecvInitialMetadata::kInitial:
181
+ case RecvInitialMetadata::kGotLatch:
182
+ self_->recv_initial_metadata_->state = RecvInitialMetadata::
183
+ kRespondedToTrailingMetadataPriorToHook;
184
+ break;
185
+ case RecvInitialMetadata::
186
+ kRespondedToTrailingMetadataPriorToHook:
187
+ abort(); // not reachable
188
+ break;
189
+ case RecvInitialMetadata::kHookedWaitingForLatch:
190
+ case RecvInitialMetadata::kHookedAndGotLatch:
191
+ case RecvInitialMetadata::kResponded:
192
+ case RecvInitialMetadata::kCompleteAndGotLatch:
193
+ case RecvInitialMetadata::kCompleteAndSetLatch:
194
+ break;
195
+ case RecvInitialMetadata::kCompleteWaitingForLatch:
196
+ self_->recv_initial_metadata_->state =
197
+ RecvInitialMetadata::kResponded;
198
+ call_closures_.Add(
199
+ absl::exchange(
200
+ self_->recv_initial_metadata_->original_on_ready,
201
+ nullptr),
202
+ GRPC_ERROR_CANCELLED,
203
+ "wake_inside_combiner:recv_initial_metadata_ready");
204
+ }
205
+ }
206
+ } else {
207
+ GPR_ASSERT(*md->get_pointer(GrpcStatusMetadata()) !=
208
+ GRPC_STATUS_OK);
209
+ grpc_error_handle error = grpc_error_set_int(
210
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING(
211
+ "early return from promise based filter"),
212
+ GRPC_ERROR_INT_GRPC_STATUS,
213
+ *md->get_pointer(GrpcStatusMetadata()));
214
+ if (auto* message = md->get_pointer(GrpcMessageMetadata())) {
215
+ error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE,
216
+ message->as_string_view());
217
+ }
218
+ GRPC_ERROR_UNREF(self_->cancelled_error_);
219
+ self_->cancelled_error_ = GRPC_ERROR_REF(error);
220
+ if (self_->recv_initial_metadata_ != nullptr) {
221
+ switch (self_->recv_initial_metadata_->state) {
222
+ case RecvInitialMetadata::kInitial:
223
+ case RecvInitialMetadata::kGotLatch:
224
+ self_->recv_initial_metadata_->state = RecvInitialMetadata::
225
+ kRespondedToTrailingMetadataPriorToHook;
226
+ break;
227
+ case RecvInitialMetadata::kHookedWaitingForLatch:
228
+ case RecvInitialMetadata::kHookedAndGotLatch:
229
+ case RecvInitialMetadata::kResponded:
230
+ break;
231
+ case RecvInitialMetadata::
232
+ kRespondedToTrailingMetadataPriorToHook:
233
+ abort(); // not reachable
234
+ break;
235
+ case RecvInitialMetadata::kCompleteWaitingForLatch:
236
+ case RecvInitialMetadata::kCompleteAndGotLatch:
237
+ case RecvInitialMetadata::kCompleteAndSetLatch:
238
+ self_->recv_initial_metadata_->state =
239
+ RecvInitialMetadata::kResponded;
240
+ call_closures_.Add(
241
+ absl::exchange(
242
+ self_->recv_initial_metadata_->original_on_ready,
243
+ nullptr),
244
+ GRPC_ERROR_REF(error),
245
+ "wake_inside_combiner:recv_initial_metadata_ready");
246
+ }
247
+ }
248
+ if (self_->send_initial_state_ == SendInitialState::kQueued) {
249
+ self_->send_initial_state_ = SendInitialState::kCancelled;
250
+ cancel_send_initial_metadata_error_ = error;
251
+ } else {
252
+ GPR_ASSERT(
253
+ self_->recv_trailing_state_ == RecvTrailingState::kInitial ||
254
+ self_->recv_trailing_state_ == RecvTrailingState::kForwarded);
255
+ self_->call_combiner()->Cancel(GRPC_ERROR_REF(error));
256
+ forward_batch_ =
257
+ grpc_make_transport_stream_op(GRPC_CLOSURE_CREATE(
258
+ [](void* p, grpc_error_handle) {
259
+ GRPC_CALL_COMBINER_STOP(static_cast<CallCombiner*>(p),
260
+ "finish_cancel");
261
+ },
262
+ self_->call_combiner(), nullptr));
263
+ forward_batch_->cancel_stream = true;
264
+ forward_batch_->payload->cancel_stream.cancel_error = error;
265
+ }
266
+ self_->recv_trailing_state_ = RecvTrailingState::kCancelled;
267
+ }
268
+ if (destroy_md) {
269
+ md->~grpc_metadata_batch();
270
+ }
271
+ scoped_activity_.Destroy();
272
+ have_scoped_activity_ = false;
273
+ self_->promise_ = ArenaPromise<ServerMetadataHandle>();
274
+ }
275
+ } break;
276
+ case SendInitialState::kInitial:
277
+ case SendInitialState::kCancelled:
278
+ // If we get a response without sending anything, we just propagate
279
+ // that up. (note: that situation isn't possible once we finish the
280
+ // promise transition).
281
+ if (self_->recv_trailing_state_ == RecvTrailingState::kComplete) {
282
+ self_->recv_trailing_state_ = RecvTrailingState::kResponded;
283
+ call_closures_.Add(
284
+ absl::exchange(self_->original_recv_trailing_metadata_ready_,
285
+ nullptr),
286
+ GRPC_ERROR_NONE, "wake_inside_combiner:recv_trailing_ready:2");
287
+ }
288
+ break;
289
+ }
290
+ }
291
+
292
+ ~PollContext() {
293
+ self_->poll_ctx_ = nullptr;
294
+ if (have_scoped_activity_) scoped_activity_.Destroy();
295
+ GRPC_CALL_STACK_REF(self_->call_stack(), "finish_poll");
296
+ bool in_combiner = true;
297
+ if (call_closures_.size() != 0) {
298
+ if (forward_batch_ != nullptr) {
299
+ call_closures_.RunClosuresWithoutYielding(self_->call_combiner());
300
+ } else {
301
+ in_combiner = false;
302
+ call_closures_.RunClosures(self_->call_combiner());
303
+ }
304
+ }
305
+ if (forward_batch_ != nullptr) {
306
+ GPR_ASSERT(in_combiner);
307
+ in_combiner = false;
308
+ forward_send_initial_metadata_ = false;
309
+ grpc_call_next_op(self_->elem(), forward_batch_);
310
+ }
311
+ if (cancel_send_initial_metadata_error_ != GRPC_ERROR_NONE) {
312
+ GPR_ASSERT(in_combiner);
313
+ forward_send_initial_metadata_ = false;
314
+ in_combiner = false;
315
+ grpc_transport_stream_op_batch_finish_with_failure(
316
+ absl::exchange(self_->send_initial_metadata_batch_, nullptr),
317
+ cancel_send_initial_metadata_error_, self_->call_combiner());
318
+ }
319
+ if (absl::exchange(forward_send_initial_metadata_, false)) {
320
+ GPR_ASSERT(in_combiner);
321
+ in_combiner = false;
322
+ grpc_call_next_op(
323
+ self_->elem(),
324
+ absl::exchange(self_->send_initial_metadata_batch_, nullptr));
325
+ }
326
+ if (repoll_) {
327
+ if (in_combiner) {
328
+ self_->WakeInsideCombiner();
329
+ } else {
330
+ struct NextPoll : public grpc_closure {
331
+ grpc_call_stack* call_stack;
332
+ ClientCallData* call_data;
333
+ };
334
+ auto run = [](void* p, grpc_error_handle) {
335
+ auto* next_poll = static_cast<NextPoll*>(p);
336
+ next_poll->call_data->WakeInsideCombiner();
337
+ GRPC_CALL_STACK_UNREF(next_poll->call_stack, "re-poll");
338
+ delete next_poll;
339
+ };
340
+ auto* p = absl::make_unique<NextPoll>().release();
341
+ p->call_stack = self_->call_stack();
342
+ p->call_data = self_;
343
+ GRPC_CALL_STACK_REF(self_->call_stack(), "re-poll");
344
+ GRPC_CLOSURE_INIT(p, run, p, nullptr);
345
+ GRPC_CALL_COMBINER_START(self_->call_combiner(), p, GRPC_ERROR_NONE,
346
+ "re-poll");
347
+ }
348
+ } else if (in_combiner) {
349
+ GRPC_CALL_COMBINER_STOP(self_->call_combiner(), "poll paused");
350
+ }
351
+ GRPC_CALL_STACK_UNREF(self_->call_stack(), "finish_poll");
352
+ }
353
+
354
+ void Repoll() { repoll_ = true; }
355
+
356
+ void ForwardSendInitialMetadata() { forward_send_initial_metadata_ = true; }
357
+
358
+ private:
359
+ ManualConstructor<ScopedActivity> scoped_activity_;
360
+ ClientCallData* self_;
361
+ CallCombinerClosureList call_closures_;
362
+ grpc_error_handle cancel_send_initial_metadata_error_ = GRPC_ERROR_NONE;
363
+ grpc_transport_stream_op_batch* forward_batch_ = nullptr;
364
+ bool repoll_ = false;
365
+ bool forward_send_initial_metadata_ = false;
366
+ bool have_scoped_activity_;
367
+ };
368
+
55
369
  ClientCallData::ClientCallData(grpc_call_element* elem,
56
- const grpc_call_element_args* args)
57
- : BaseCallData(elem, args) {
370
+ const grpc_call_element_args* args,
371
+ uint8_t flags)
372
+ : BaseCallData(elem, args, flags) {
58
373
  GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready_,
59
374
  RecvTrailingMetadataReadyCallback, this,
60
375
  grpc_schedule_on_exec_ctx);
376
+ if (server_initial_metadata_latch() != nullptr) {
377
+ recv_initial_metadata_ = arena()->New<RecvInitialMetadata>();
378
+ }
61
379
  }
62
380
 
63
381
  ClientCallData::~ClientCallData() {
64
- GPR_ASSERT(!is_polling_);
382
+ GPR_ASSERT(poll_ctx_ == nullptr);
65
383
  GRPC_ERROR_UNREF(cancelled_error_);
384
+ if (recv_initial_metadata_ != nullptr) {
385
+ recv_initial_metadata_->~RecvInitialMetadata();
386
+ }
66
387
  }
67
388
 
68
389
  // Activity implementation.
69
390
  void ClientCallData::ForceImmediateRepoll() {
70
- GPR_ASSERT(is_polling_);
71
- repoll_ = true;
391
+ GPR_ASSERT(poll_ctx_ != nullptr);
392
+ poll_ctx_->Repoll();
72
393
  }
73
394
 
74
395
  // Handle one grpc_transport_stream_op_batch
@@ -88,6 +409,42 @@ void ClientCallData::StartBatch(grpc_transport_stream_op_batch* batch) {
88
409
  return;
89
410
  }
90
411
 
412
+ if (recv_initial_metadata_ != nullptr && batch->recv_initial_metadata) {
413
+ bool hook = true;
414
+ switch (recv_initial_metadata_->state) {
415
+ case RecvInitialMetadata::kInitial:
416
+ recv_initial_metadata_->state =
417
+ RecvInitialMetadata::kHookedWaitingForLatch;
418
+ break;
419
+ case RecvInitialMetadata::kGotLatch:
420
+ recv_initial_metadata_->state = RecvInitialMetadata::kHookedAndGotLatch;
421
+ break;
422
+ case RecvInitialMetadata::kRespondedToTrailingMetadataPriorToHook:
423
+ hook = false;
424
+ break;
425
+ case RecvInitialMetadata::kHookedWaitingForLatch:
426
+ case RecvInitialMetadata::kHookedAndGotLatch:
427
+ case RecvInitialMetadata::kCompleteWaitingForLatch:
428
+ case RecvInitialMetadata::kCompleteAndGotLatch:
429
+ case RecvInitialMetadata::kCompleteAndSetLatch:
430
+ case RecvInitialMetadata::kResponded:
431
+ abort(); // unreachable
432
+ }
433
+ if (hook) {
434
+ auto cb = [](void* ptr, grpc_error_handle error) {
435
+ ClientCallData* self = static_cast<ClientCallData*>(ptr);
436
+ self->RecvInitialMetadataReady(error);
437
+ };
438
+ recv_initial_metadata_->metadata =
439
+ batch->payload->recv_initial_metadata.recv_initial_metadata;
440
+ recv_initial_metadata_->original_on_ready =
441
+ batch->payload->recv_initial_metadata.recv_initial_metadata_ready;
442
+ GRPC_CLOSURE_INIT(&recv_initial_metadata_->on_ready, cb, this, nullptr);
443
+ batch->payload->recv_initial_metadata.recv_initial_metadata_ready =
444
+ &recv_initial_metadata_->on_ready;
445
+ }
446
+ }
447
+
91
448
  // send_initial_metadata: seeing this triggers the start of the promise part
92
449
  // of this filter.
93
450
  if (batch->send_initial_metadata) {
@@ -136,7 +493,7 @@ void ClientCallData::Cancel(grpc_error_handle error) {
136
493
  GRPC_ERROR_UNREF(cancelled_error_);
137
494
  cancelled_error_ = GRPC_ERROR_REF(error);
138
495
  // Stop running the promise.
139
- promise_ = ArenaPromise<TrailingMetadata>();
496
+ promise_ = ArenaPromise<ServerMetadataHandle>();
140
497
  // If we have an op queued, fail that op.
141
498
  // Record what we've done.
142
499
  if (send_initial_state_ == SendInitialState::kQueued) {
@@ -164,6 +521,26 @@ void ClientCallData::Cancel(grpc_error_handle error) {
164
521
  } else {
165
522
  send_initial_state_ = SendInitialState::kCancelled;
166
523
  }
524
+ if (recv_initial_metadata_ != nullptr) {
525
+ switch (recv_initial_metadata_->state) {
526
+ case RecvInitialMetadata::kCompleteWaitingForLatch:
527
+ case RecvInitialMetadata::kCompleteAndGotLatch:
528
+ case RecvInitialMetadata::kCompleteAndSetLatch:
529
+ recv_initial_metadata_->state = RecvInitialMetadata::kResponded;
530
+ GRPC_CALL_COMBINER_START(
531
+ call_combiner(),
532
+ absl::exchange(recv_initial_metadata_->original_on_ready, nullptr),
533
+ GRPC_ERROR_REF(error), "propagate cancellation");
534
+ break;
535
+ case RecvInitialMetadata::kInitial:
536
+ case RecvInitialMetadata::kGotLatch:
537
+ case RecvInitialMetadata::kRespondedToTrailingMetadataPriorToHook:
538
+ case RecvInitialMetadata::kHookedWaitingForLatch:
539
+ case RecvInitialMetadata::kHookedAndGotLatch:
540
+ case RecvInitialMetadata::kResponded:
541
+ break;
542
+ }
543
+ }
167
544
  }
168
545
 
169
546
  // Begin running the promise - which will ultimately take some initial
@@ -173,16 +550,50 @@ void ClientCallData::StartPromise() {
173
550
  ChannelFilter* filter = static_cast<ChannelFilter*>(elem()->channel_data);
174
551
 
175
552
  // Construct the promise.
176
- {
177
- ScopedActivity activity(this);
178
- promise_ = filter->MakeCallPromise(
179
- WrapMetadata(send_initial_metadata_batch_->payload
180
- ->send_initial_metadata.send_initial_metadata),
181
- [this](ClientInitialMetadata initial_metadata) {
182
- return MakeNextPromise(std::move(initial_metadata));
183
- });
553
+ PollContext ctx(this);
554
+ promise_ = filter->MakeCallPromise(
555
+ CallArgs{WrapMetadata(send_initial_metadata_batch_->payload
556
+ ->send_initial_metadata.send_initial_metadata),
557
+ server_initial_metadata_latch()},
558
+ [this](CallArgs call_args) {
559
+ return MakeNextPromise(std::move(call_args));
560
+ });
561
+ ctx.Run();
562
+ }
563
+
564
+ void ClientCallData::RecvInitialMetadataReady(grpc_error_handle error) {
565
+ ScopedContext context(this);
566
+ switch (recv_initial_metadata_->state) {
567
+ case RecvInitialMetadata::kHookedWaitingForLatch:
568
+ recv_initial_metadata_->state =
569
+ RecvInitialMetadata::kCompleteWaitingForLatch;
570
+ break;
571
+ case RecvInitialMetadata::kHookedAndGotLatch:
572
+ recv_initial_metadata_->state = RecvInitialMetadata::kCompleteAndGotLatch;
573
+ break;
574
+ case RecvInitialMetadata::kInitial:
575
+ case RecvInitialMetadata::kGotLatch:
576
+ case RecvInitialMetadata::kCompleteWaitingForLatch:
577
+ case RecvInitialMetadata::kCompleteAndGotLatch:
578
+ case RecvInitialMetadata::kCompleteAndSetLatch:
579
+ case RecvInitialMetadata::kResponded:
580
+ case RecvInitialMetadata::kRespondedToTrailingMetadataPriorToHook:
581
+ abort(); // unreachable
582
+ }
583
+ if (error != GRPC_ERROR_NONE) {
584
+ recv_initial_metadata_->state = RecvInitialMetadata::kResponded;
585
+ GRPC_CALL_COMBINER_START(
586
+ call_combiner(),
587
+ absl::exchange(recv_initial_metadata_->original_on_ready, nullptr),
588
+ GRPC_ERROR_REF(error), "propagate cancellation");
589
+ } else if (send_initial_state_ == SendInitialState::kCancelled ||
590
+ recv_trailing_state_ == RecvTrailingState::kResponded) {
591
+ recv_initial_metadata_->state = RecvInitialMetadata::kResponded;
592
+ GRPC_CALL_COMBINER_START(
593
+ call_combiner(),
594
+ absl::exchange(recv_initial_metadata_->original_on_ready, nullptr),
595
+ GRPC_ERROR_REF(cancelled_error_), "propagate cancellation");
184
596
  }
185
- // Poll once.
186
597
  WakeInsideCombiner();
187
598
  }
188
599
 
@@ -203,12 +614,46 @@ void ClientCallData::HookRecvTrailingMetadata(
203
614
  // Effectively:
204
615
  // - put the modified initial metadata into the batch to be sent down.
205
616
  // - return a wrapper around PollTrailingMetadata as the promise.
206
- ArenaPromise<TrailingMetadata> ClientCallData::MakeNextPromise(
207
- ClientInitialMetadata initial_metadata) {
617
+ ArenaPromise<ServerMetadataHandle> ClientCallData::MakeNextPromise(
618
+ CallArgs call_args) {
619
+ GPR_ASSERT(poll_ctx_ != nullptr);
208
620
  GPR_ASSERT(send_initial_state_ == SendInitialState::kQueued);
209
621
  send_initial_metadata_batch_->payload->send_initial_metadata
210
- .send_initial_metadata = UnwrapMetadata(std::move(initial_metadata));
211
- return ArenaPromise<TrailingMetadata>(
622
+ .send_initial_metadata =
623
+ UnwrapMetadata(std::move(call_args.client_initial_metadata));
624
+ if (recv_initial_metadata_ != nullptr) {
625
+ // Call args should contain a latch for receiving initial metadata.
626
+ // It might be the one we passed in - in which case we know this filter
627
+ // only wants to examine the metadata, or it might be a new instance, in
628
+ // which case we know the filter wants to mutate.
629
+ GPR_ASSERT(call_args.server_initial_metadata != nullptr);
630
+ recv_initial_metadata_->server_initial_metadata_publisher =
631
+ call_args.server_initial_metadata;
632
+ switch (recv_initial_metadata_->state) {
633
+ case RecvInitialMetadata::kInitial:
634
+ recv_initial_metadata_->state = RecvInitialMetadata::kGotLatch;
635
+ break;
636
+ case RecvInitialMetadata::kHookedWaitingForLatch:
637
+ recv_initial_metadata_->state = RecvInitialMetadata::kHookedAndGotLatch;
638
+ poll_ctx_->Repoll();
639
+ break;
640
+ case RecvInitialMetadata::kCompleteWaitingForLatch:
641
+ recv_initial_metadata_->state =
642
+ RecvInitialMetadata::kCompleteAndGotLatch;
643
+ poll_ctx_->Repoll();
644
+ break;
645
+ case RecvInitialMetadata::kGotLatch:
646
+ case RecvInitialMetadata::kHookedAndGotLatch:
647
+ case RecvInitialMetadata::kCompleteAndGotLatch:
648
+ case RecvInitialMetadata::kCompleteAndSetLatch:
649
+ case RecvInitialMetadata::kResponded:
650
+ case RecvInitialMetadata::kRespondedToTrailingMetadataPriorToHook:
651
+ abort(); // unreachable
652
+ }
653
+ } else {
654
+ GPR_ASSERT(call_args.server_initial_metadata == nullptr);
655
+ }
656
+ return ArenaPromise<ServerMetadataHandle>(
212
657
  [this]() { return PollTrailingMetadata(); });
213
658
  }
214
659
 
@@ -216,7 +661,8 @@ ArenaPromise<TrailingMetadata> ClientCallData::MakeNextPromise(
216
661
  // First poll: send the send_initial_metadata op down the stack.
217
662
  // All polls: await receiving the trailing metadata, then return it to the
218
663
  // application.
219
- Poll<TrailingMetadata> ClientCallData::PollTrailingMetadata() {
664
+ Poll<ServerMetadataHandle> ClientCallData::PollTrailingMetadata() {
665
+ GPR_ASSERT(poll_ctx_ != nullptr);
220
666
  if (send_initial_state_ == SendInitialState::kQueued) {
221
667
  // First poll: pass the send_initial_metadata op down the stack.
222
668
  GPR_ASSERT(send_initial_metadata_batch_ != nullptr);
@@ -226,7 +672,7 @@ Poll<TrailingMetadata> ClientCallData::PollTrailingMetadata() {
226
672
  HookRecvTrailingMetadata(send_initial_metadata_batch_);
227
673
  recv_trailing_state_ = RecvTrailingState::kForwarded;
228
674
  }
229
- forward_send_initial_metadata_ = true;
675
+ poll_ctx_->ForwardSendInitialMetadata();
230
676
  }
231
677
  switch (recv_trailing_state_) {
232
678
  case RecvTrailingState::kInitial:
@@ -261,6 +707,15 @@ void ClientCallData::RecvTrailingMetadataReadyCallback(
261
707
  }
262
708
 
263
709
  void ClientCallData::RecvTrailingMetadataReady(grpc_error_handle error) {
710
+ // If we were cancelled prior to receiving this callback, we should simply
711
+ // forward the callback up with the same error.
712
+ if (recv_trailing_state_ == RecvTrailingState::kCancelled) {
713
+ if (grpc_closure* call_closure =
714
+ absl::exchange(original_recv_trailing_metadata_ready_, nullptr)) {
715
+ Closure::Run(DEBUG_LOCATION, call_closure, GRPC_ERROR_REF(error));
716
+ }
717
+ return;
718
+ }
264
719
  // If there was an error, we'll put that into the trailing metadata and
265
720
  // proceed as if there was not.
266
721
  if (error != GRPC_ERROR_NONE) {
@@ -274,7 +729,7 @@ void ClientCallData::RecvTrailingMetadataReady(grpc_error_handle error) {
274
729
  WakeInsideCombiner();
275
730
  }
276
731
 
277
- // Given an error, fill in TrailingMetadata to represent that error.
732
+ // Given an error, fill in ServerMetadataHandle to represent that error.
278
733
  void ClientCallData::SetStatusFromError(grpc_metadata_batch* metadata,
279
734
  grpc_error_handle error) {
280
735
  grpc_status_code status_code = GRPC_STATUS_UNKNOWN;
@@ -288,131 +743,7 @@ void ClientCallData::SetStatusFromError(grpc_metadata_batch* metadata,
288
743
  }
289
744
 
290
745
  // Wakeup and poll the promise if appropriate.
291
- void ClientCallData::WakeInsideCombiner() {
292
- GPR_ASSERT(!is_polling_);
293
- grpc_closure* call_closure = nullptr;
294
- is_polling_ = true;
295
- grpc_error_handle cancel_send_initial_metadata_error = GRPC_ERROR_NONE;
296
- grpc_transport_stream_op_batch* forward_batch = nullptr;
297
- switch (send_initial_state_) {
298
- case SendInitialState::kQueued:
299
- case SendInitialState::kForwarded: {
300
- // Poll the promise once since we're waiting for it.
301
- Poll<TrailingMetadata> poll;
302
- {
303
- ScopedActivity activity(this);
304
- poll = promise_();
305
- }
306
- if (auto* r = absl::get_if<TrailingMetadata>(&poll)) {
307
- promise_ = ArenaPromise<TrailingMetadata>();
308
- auto* md = UnwrapMetadata(std::move(*r));
309
- bool destroy_md = true;
310
- if (recv_trailing_state_ == RecvTrailingState::kComplete) {
311
- if (recv_trailing_metadata_ != md) {
312
- *recv_trailing_metadata_ = std::move(*md);
313
- } else {
314
- destroy_md = false;
315
- }
316
- recv_trailing_state_ = RecvTrailingState::kResponded;
317
- call_closure =
318
- absl::exchange(original_recv_trailing_metadata_ready_, nullptr);
319
- } else {
320
- GPR_ASSERT(*md->get_pointer(GrpcStatusMetadata()) != GRPC_STATUS_OK);
321
- grpc_error_handle error =
322
- grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
323
- "early return from promise based filter"),
324
- GRPC_ERROR_INT_GRPC_STATUS,
325
- *md->get_pointer(GrpcStatusMetadata()));
326
- if (auto* message = md->get_pointer(GrpcMessageMetadata())) {
327
- error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE,
328
- message->as_string_view());
329
- }
330
- GRPC_ERROR_UNREF(cancelled_error_);
331
- cancelled_error_ = GRPC_ERROR_REF(error);
332
- if (send_initial_state_ == SendInitialState::kQueued) {
333
- send_initial_state_ = SendInitialState::kCancelled;
334
- cancel_send_initial_metadata_error = error;
335
- } else {
336
- GPR_ASSERT(recv_trailing_state_ == RecvTrailingState::kInitial ||
337
- recv_trailing_state_ == RecvTrailingState::kForwarded);
338
- call_combiner()->Cancel(GRPC_ERROR_REF(error));
339
- forward_batch = grpc_make_transport_stream_op(GRPC_CLOSURE_CREATE(
340
- [](void*, grpc_error_handle) {}, nullptr, nullptr));
341
- forward_batch->cancel_stream = true;
342
- forward_batch->payload->cancel_stream.cancel_error = error;
343
- }
344
- recv_trailing_state_ = RecvTrailingState::kCancelled;
345
- }
346
- if (destroy_md) {
347
- md->~grpc_metadata_batch();
348
- }
349
- }
350
- } break;
351
- case SendInitialState::kInitial:
352
- case SendInitialState::kCancelled:
353
- // If we get a response without sending anything, we just propagate
354
- // that up. (note: that situation isn't possible once we finish the
355
- // promise transition).
356
- if (recv_trailing_state_ == RecvTrailingState::kComplete) {
357
- recv_trailing_state_ = RecvTrailingState::kResponded;
358
- call_closure =
359
- absl::exchange(original_recv_trailing_metadata_ready_, nullptr);
360
- }
361
- break;
362
- }
363
- GRPC_CALL_STACK_REF(call_stack(), "finish_poll");
364
- is_polling_ = false;
365
- bool in_combiner = true;
366
- bool repoll = absl::exchange(repoll_, false);
367
- if (forward_batch != nullptr) {
368
- GPR_ASSERT(in_combiner);
369
- in_combiner = false;
370
- forward_send_initial_metadata_ = false;
371
- grpc_call_next_op(elem(), forward_batch);
372
- }
373
- if (cancel_send_initial_metadata_error != GRPC_ERROR_NONE) {
374
- GPR_ASSERT(in_combiner);
375
- forward_send_initial_metadata_ = false;
376
- in_combiner = false;
377
- grpc_transport_stream_op_batch_finish_with_failure(
378
- absl::exchange(send_initial_metadata_batch_, nullptr),
379
- cancel_send_initial_metadata_error, call_combiner());
380
- }
381
- if (absl::exchange(forward_send_initial_metadata_, false)) {
382
- GPR_ASSERT(in_combiner);
383
- in_combiner = false;
384
- grpc_call_next_op(elem(),
385
- absl::exchange(send_initial_metadata_batch_, nullptr));
386
- }
387
- if (call_closure != nullptr) {
388
- GPR_ASSERT(in_combiner);
389
- in_combiner = false;
390
- Closure::Run(DEBUG_LOCATION, call_closure, GRPC_ERROR_NONE);
391
- }
392
- if (repoll) {
393
- if (in_combiner) {
394
- WakeInsideCombiner();
395
- } else {
396
- struct NextPoll : public grpc_closure {
397
- grpc_call_stack* call_stack;
398
- ClientCallData* call_data;
399
- };
400
- auto run = [](void* p, grpc_error_handle) {
401
- auto* next_poll = static_cast<NextPoll*>(p);
402
- next_poll->call_data->WakeInsideCombiner();
403
- GRPC_CALL_STACK_UNREF(next_poll->call_stack, "re-poll");
404
- delete next_poll;
405
- };
406
- auto* p = new NextPoll;
407
- GRPC_CALL_STACK_REF(call_stack(), "re-poll");
408
- GRPC_CLOSURE_INIT(p, run, p, nullptr);
409
- GRPC_CALL_COMBINER_START(call_combiner(), p, GRPC_ERROR_NONE, "re-poll");
410
- }
411
- } else if (in_combiner) {
412
- GRPC_CALL_COMBINER_STOP(call_combiner(), "poll paused");
413
- }
414
- GRPC_CALL_STACK_UNREF(call_stack(), "finish_poll");
415
- }
746
+ void ClientCallData::WakeInsideCombiner() { PollContext(this).Run(); }
416
747
 
417
748
  void ClientCallData::OnWakeup() {
418
749
  ScopedContext context(this);
@@ -423,8 +754,9 @@ void ClientCallData::OnWakeup() {
423
754
  // ServerCallData
424
755
 
425
756
  ServerCallData::ServerCallData(grpc_call_element* elem,
426
- const grpc_call_element_args* args)
427
- : BaseCallData(elem, args) {
757
+ const grpc_call_element_args* args,
758
+ uint8_t flags)
759
+ : BaseCallData(elem, args, flags) {
428
760
  GRPC_CLOSURE_INIT(&recv_initial_metadata_ready_,
429
761
  RecvInitialMetadataReadyCallback, this,
430
762
  grpc_schedule_on_exec_ctx);
@@ -505,7 +837,7 @@ void ServerCallData::Cancel(grpc_error_handle error) {
505
837
  GRPC_ERROR_UNREF(cancelled_error_);
506
838
  cancelled_error_ = GRPC_ERROR_REF(error);
507
839
  // Stop running the promise.
508
- promise_ = ArenaPromise<TrailingMetadata>();
840
+ promise_ = ArenaPromise<ServerMetadataHandle>();
509
841
  if (send_trailing_state_ == SendTrailingState::kQueued) {
510
842
  send_trailing_state_ = SendTrailingState::kCancelled;
511
843
  struct FailBatch : public grpc_closure {
@@ -534,20 +866,20 @@ void ServerCallData::Cancel(grpc_error_handle error) {
534
866
  // Effectively:
535
867
  // - put the modified initial metadata into the batch being sent up.
536
868
  // - return a wrapper around PollTrailingMetadata as the promise.
537
- ArenaPromise<TrailingMetadata> ServerCallData::MakeNextPromise(
538
- ClientInitialMetadata initial_metadata) {
869
+ ArenaPromise<ServerMetadataHandle> ServerCallData::MakeNextPromise(
870
+ CallArgs call_args) {
539
871
  GPR_ASSERT(recv_initial_state_ == RecvInitialState::kComplete);
540
- GPR_ASSERT(UnwrapMetadata(std::move(initial_metadata)) ==
872
+ GPR_ASSERT(UnwrapMetadata(std::move(call_args.client_initial_metadata)) ==
541
873
  recv_initial_metadata_);
542
874
  forward_recv_initial_metadata_callback_ = true;
543
- return ArenaPromise<TrailingMetadata>(
875
+ return ArenaPromise<ServerMetadataHandle>(
544
876
  [this]() { return PollTrailingMetadata(); });
545
877
  }
546
878
 
547
879
  // Wrapper to make it look like we're calling the next filter as a promise.
548
880
  // All polls: await sending the trailing metadata, then foward it down the
549
881
  // stack.
550
- Poll<TrailingMetadata> ServerCallData::PollTrailingMetadata() {
882
+ Poll<ServerMetadataHandle> ServerCallData::PollTrailingMetadata() {
551
883
  switch (send_trailing_state_) {
552
884
  case SendTrailingState::kInitial:
553
885
  return Pending{};
@@ -586,11 +918,12 @@ void ServerCallData::RecvInitialMetadataReady(grpc_error_handle error) {
586
918
  ScopedContext context(this);
587
919
  // Construct the promise.
588
920
  ChannelFilter* filter = static_cast<ChannelFilter*>(elem()->channel_data);
589
- promise_ = filter->MakeCallPromise(
590
- WrapMetadata(recv_initial_metadata_),
591
- [this](ClientInitialMetadata initial_metadata) {
592
- return MakeNextPromise(std::move(initial_metadata));
593
- });
921
+ promise_ =
922
+ filter->MakeCallPromise(CallArgs{WrapMetadata(recv_initial_metadata_),
923
+ server_initial_metadata_latch()},
924
+ [this](CallArgs call_args) {
925
+ return MakeNextPromise(std::move(call_args));
926
+ });
594
927
  // Poll once.
595
928
  bool own_error = false;
596
929
  WakeInsideCombiner([&error, &own_error](grpc_error_handle new_error) {
@@ -610,12 +943,12 @@ void ServerCallData::WakeInsideCombiner(
610
943
  bool forward_send_trailing_metadata = false;
611
944
  is_polling_ = true;
612
945
  if (recv_initial_state_ == RecvInitialState::kComplete) {
613
- Poll<TrailingMetadata> poll;
946
+ Poll<ServerMetadataHandle> poll;
614
947
  {
615
948
  ScopedActivity activity(this);
616
949
  poll = promise_();
617
950
  }
618
- if (auto* r = absl::get_if<TrailingMetadata>(&poll)) {
951
+ if (auto* r = absl::get_if<ServerMetadataHandle>(&poll)) {
619
952
  auto* md = UnwrapMetadata(std::move(*r));
620
953
  bool destroy_md = true;
621
954
  switch (send_trailing_state_) {