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
@@ -29,11 +29,12 @@
29
29
  #include "src/core/ext/filters/fault_injection/service_config_parser.h"
30
30
  #include "src/core/lib/channel/channel_stack.h"
31
31
  #include "src/core/lib/channel/status_util.h"
32
- #include "src/core/lib/gprpp/sync.h"
33
- #include "src/core/lib/iomgr/closure.h"
34
- #include "src/core/lib/iomgr/timer.h"
32
+ #include "src/core/lib/gprpp/capture.h"
33
+ #include "src/core/lib/promise/sleep.h"
34
+ #include "src/core/lib/promise/try_seq.h"
35
35
  #include "src/core/lib/service_config/service_config_call_data.h"
36
36
  #include "src/core/lib/transport/status_conversion.h"
37
+ #include "src/core/lib/transport/transport.h"
37
38
 
38
39
  namespace grpc_core {
39
40
 
@@ -62,434 +63,193 @@ inline bool UnderFraction(const uint32_t numerator,
62
63
  return random_number < numerator;
63
64
  }
64
65
 
65
- class ChannelData {
66
+ // Tracks an active faults lifetime.
67
+ // Increments g_active_faults when created, and decrements it when destroyed.
68
+ class FaultHandle {
66
69
  public:
67
- static grpc_error_handle Init(grpc_channel_element* elem,
68
- grpc_channel_element_args* args);
69
- static void Destroy(grpc_channel_element* elem);
70
-
71
- int index() const { return index_; }
72
- size_t service_config_parser_index() const {
73
- return service_config_parser_index_;
70
+ explicit FaultHandle(bool active) : active_(active) {
71
+ if (active) {
72
+ g_active_faults.fetch_add(1, std::memory_order_relaxed);
73
+ }
74
+ }
75
+ ~FaultHandle() {
76
+ if (active_) {
77
+ g_active_faults.fetch_sub(1, std::memory_order_relaxed);
78
+ }
79
+ }
80
+ FaultHandle(const FaultHandle&) = delete;
81
+ FaultHandle& operator=(const FaultHandle&) = delete;
82
+ FaultHandle(FaultHandle&& other) noexcept
83
+ : active_(absl::exchange(other.active_, false)) {}
84
+ FaultHandle& operator=(FaultHandle&& other) noexcept {
85
+ std::swap(active_, other.active_);
86
+ return *this;
74
87
  }
75
88
 
76
89
  private:
77
- ChannelData(grpc_channel_element* elem, grpc_channel_element_args* args);
78
- ~ChannelData() = default;
79
-
80
- // The relative index of instances of the same filter.
81
- int index_;
82
- const size_t service_config_parser_index_;
90
+ bool active_;
83
91
  };
84
92
 
85
- class CallData {
86
- public:
87
- static grpc_error_handle Init(grpc_call_element* elem,
88
- const grpc_call_element_args* args);
93
+ } // namespace
89
94
 
90
- static void Destroy(grpc_call_element* elem,
91
- const grpc_call_final_info* /*final_info*/,
92
- grpc_closure* /*then_schedule_closure*/);
95
+ class FaultInjectionFilter::InjectionDecision {
96
+ public:
97
+ InjectionDecision(uint32_t max_faults, Duration delay_time,
98
+ absl::optional<absl::Status> abort_request)
99
+ : max_faults_(max_faults),
100
+ delay_time_(delay_time),
101
+ abort_request_(abort_request) {}
93
102
 
94
- static void StartTransportStreamOpBatch(
95
- grpc_call_element* elem, grpc_transport_stream_op_batch* batch);
103
+ std::string ToString() const;
104
+ Timestamp DelayUntil();
105
+ absl::Status MaybeAbort() const;
96
106
 
97
107
  private:
98
- class ResumeBatchCanceller;
108
+ bool HaveActiveFaultsQuota() const;
99
109
 
100
- CallData(grpc_call_element* elem, const grpc_call_element_args* args);
101
- ~CallData();
102
-
103
- void DecideWhetherToInjectFaults(grpc_metadata_batch* initial_metadata);
104
-
105
- // Checks if current active faults exceed the allowed max faults.
106
- bool HaveActiveFaultsQuota(bool increment);
107
-
108
- // Returns true if this RPC needs to be delayed. If so, this call will be
109
- // counted as an active fault.
110
- bool MaybeDelay();
111
-
112
- // Returns the aborted RPC status if this RPC needs to be aborted. If so,
113
- // this call will be counted as an active fault. Otherwise, it returns
114
- // GRPC_ERROR_NONE.
115
- // If this call is already been delay injected, skip the active faults
116
- // quota check.
117
- grpc_error_handle MaybeAbort();
118
-
119
- // Delays the stream operations batch.
120
- void DelayBatch(grpc_call_element* elem,
121
- grpc_transport_stream_op_batch* batch);
122
-
123
- // Cancels the delay timer.
124
- void CancelDelayTimer() { grpc_timer_cancel(&delay_timer_); }
125
-
126
- // Finishes the fault injection, should only be called once.
127
- void FaultInjectionFinished() {
128
- g_active_faults.fetch_sub(1, std::memory_order_relaxed);
129
- }
130
-
131
- // This is a callback that will be invoked after the delay timer is up.
132
- static void ResumeBatch(void* arg, grpc_error_handle error);
133
-
134
- // This is a callback invoked upon completion of recv_trailing_metadata.
135
- // Injects the abort_error_ to the recv_trailing_metadata batch if needed.
136
- static void HijackedRecvTrailingMetadataReady(void* arg, grpc_error_handle);
137
-
138
- // Used to track the policy structs that needs to be destroyed in dtor.
139
- bool fi_policy_owned_ = false;
140
- const FaultInjectionMethodParsedConfig::FaultInjectionPolicy* fi_policy_;
141
- grpc_call_stack* owning_call_;
142
- Arena* arena_;
143
- CallCombiner* call_combiner_;
144
-
145
- // Indicates whether we are doing a delay and/or an abort for this call.
146
- bool delay_request_ = false;
147
- bool abort_request_ = false;
148
-
149
- // Delay states
150
- grpc_timer delay_timer_ ABSL_GUARDED_BY(delay_mu_);
151
- ResumeBatchCanceller* resume_batch_canceller_ ABSL_GUARDED_BY(delay_mu_);
152
- grpc_transport_stream_op_batch* delayed_batch_ ABSL_GUARDED_BY(delay_mu_);
153
- // Abort states
154
- grpc_error_handle abort_error_ = GRPC_ERROR_NONE;
155
- grpc_closure recv_trailing_metadata_ready_;
156
- grpc_closure* original_recv_trailing_metadata_ready_;
157
- // Protects the asynchronous delay, resume, and cancellation.
158
- Mutex delay_mu_;
110
+ uint32_t max_faults_;
111
+ Duration delay_time_;
112
+ absl::optional<absl::Status> abort_request_;
113
+ FaultHandle active_fault_{false};
159
114
  };
160
115
 
161
- // ChannelData
162
-
163
- grpc_error_handle ChannelData::Init(grpc_channel_element* elem,
164
- grpc_channel_element_args* args) {
165
- GPR_ASSERT(elem->filter == &FaultInjectionFilterVtable);
166
- new (elem->channel_data) ChannelData(elem, args);
167
- return GRPC_ERROR_NONE;
168
- }
169
-
170
- void ChannelData::Destroy(grpc_channel_element* elem) {
171
- auto* chand = static_cast<ChannelData*>(elem->channel_data);
172
- chand->~ChannelData();
116
+ absl::StatusOr<FaultInjectionFilter> FaultInjectionFilter::Create(
117
+ ChannelArgs, ChannelFilter::Args filter_args) {
118
+ return FaultInjectionFilter(filter_args);
173
119
  }
174
120
 
175
- ChannelData::ChannelData(grpc_channel_element* elem,
176
- grpc_channel_element_args* args)
177
- : index_(
178
- grpc_channel_stack_filter_instance_number(args->channel_stack, elem)),
121
+ FaultInjectionFilter::FaultInjectionFilter(ChannelFilter::Args filter_args)
122
+ : index_(grpc_channel_stack_filter_instance_number(
123
+ filter_args.channel_stack(),
124
+ filter_args.uninitialized_channel_element())),
179
125
  service_config_parser_index_(
180
126
  FaultInjectionServiceConfigParser::ParserIndex()) {}
181
127
 
182
- // CallData::ResumeBatchCanceller
183
-
184
- class CallData::ResumeBatchCanceller {
185
- public:
186
- explicit ResumeBatchCanceller(grpc_call_element* elem) : elem_(elem) {
187
- auto* calld = static_cast<CallData*>(elem->call_data);
188
- GRPC_CALL_STACK_REF(calld->owning_call_, "ResumeBatchCanceller");
189
- GRPC_CLOSURE_INIT(&closure_, &Cancel, this, grpc_schedule_on_exec_ctx);
190
- calld->call_combiner_->SetNotifyOnCancel(&closure_);
191
- }
192
-
193
- private:
194
- static void Cancel(void* arg, grpc_error_handle error) {
195
- auto* self = static_cast<ResumeBatchCanceller*>(arg);
196
- auto* chand = static_cast<ChannelData*>(self->elem_->channel_data);
197
- auto* calld = static_cast<CallData*>(self->elem_->call_data);
198
- {
199
- MutexLock lock(&calld->delay_mu_);
200
- if (GRPC_TRACE_FLAG_ENABLED(grpc_fault_injection_filter_trace)) {
201
- gpr_log(GPR_INFO,
202
- "chand=%p calld=%p: cancelling schdueled pick: "
203
- "error=%s self=%p calld->resume_batch_canceller_=%p",
204
- chand, calld, grpc_error_std_string(error).c_str(), self,
205
- calld->resume_batch_canceller_);
206
- }
207
- if (error != GRPC_ERROR_NONE && calld->resume_batch_canceller_ == self) {
208
- // Cancel the delayed pick.
209
- calld->CancelDelayTimer();
210
- calld->FaultInjectionFinished();
211
- // Fail pending batches on the call.
212
- grpc_transport_stream_op_batch_finish_with_failure(
213
- calld->delayed_batch_, GRPC_ERROR_REF(error),
214
- calld->call_combiner_);
215
- }
216
- }
217
- GRPC_CALL_STACK_UNREF(calld->owning_call_, "ResumeBatchCanceller");
218
- delete self;
219
- }
220
-
221
- grpc_call_element* elem_;
222
- grpc_closure closure_;
223
- };
224
-
225
- // CallData
226
-
227
- grpc_error_handle CallData::Init(grpc_call_element* elem,
228
- const grpc_call_element_args* args) {
229
- auto* calld = new (elem->call_data) CallData(elem, args);
230
- if (calld->fi_policy_ == nullptr) {
231
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
232
- "failed to find fault injection policy");
233
- }
234
- return GRPC_ERROR_NONE;
235
- }
236
-
237
- void CallData::Destroy(grpc_call_element* elem,
238
- const grpc_call_final_info* /*final_info*/,
239
- grpc_closure* /*then_schedule_closure*/) {
240
- auto* calld = static_cast<CallData*>(elem->call_data);
241
- calld->~CallData();
242
- }
243
-
244
- void CallData::StartTransportStreamOpBatch(
245
- grpc_call_element* elem, grpc_transport_stream_op_batch* batch) {
246
- auto* calld = static_cast<CallData*>(elem->call_data);
247
- // There should only be one send_initial_metdata op, and fault injection also
248
- // only need to be enforced once.
249
- if (batch->send_initial_metadata) {
250
- calld->DecideWhetherToInjectFaults(
251
- batch->payload->send_initial_metadata.send_initial_metadata);
252
- if (GRPC_TRACE_FLAG_ENABLED(grpc_fault_injection_filter_trace)) {
253
- gpr_log(GPR_INFO,
254
- "chand=%p calld=%p: Fault injection triggered delay=%d abort=%d",
255
- elem->channel_data, calld, calld->delay_request_,
256
- calld->abort_request_);
257
- }
258
- if (calld->MaybeDelay()) {
259
- // Delay the batch, and pass down the batch in the scheduled closure.
260
- calld->DelayBatch(elem, batch);
261
- return;
262
- }
263
- grpc_error_handle abort_error = calld->MaybeAbort();
264
- if (abort_error != GRPC_ERROR_NONE) {
265
- calld->abort_error_ = abort_error;
266
- grpc_transport_stream_op_batch_finish_with_failure(
267
- batch, GRPC_ERROR_REF(calld->abort_error_), calld->call_combiner_);
268
- return;
269
- }
270
- } else {
271
- if (batch->recv_trailing_metadata) {
272
- // Intercept recv_trailing_metadata callback so that we can inject the
273
- // failure when aborting streaming calls, because their
274
- // recv_trailing_metatdata op may not be on the same batch as the
275
- // send_initial_metadata op.
276
- calld->original_recv_trailing_metadata_ready_ =
277
- batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready;
278
- batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready =
279
- &calld->recv_trailing_metadata_ready_;
280
- }
281
- if (calld->abort_error_ != GRPC_ERROR_NONE) {
282
- // If we already decided to abort, then immediately fail this batch.
283
- grpc_transport_stream_op_batch_finish_with_failure(
284
- batch, GRPC_ERROR_REF(calld->abort_error_), calld->call_combiner_);
285
- return;
286
- }
128
+ // Construct a promise for one call.
129
+ ArenaPromise<ServerMetadataHandle> FaultInjectionFilter::MakeCallPromise(
130
+ CallArgs call_args, NextPromiseFactory next_promise_factory) {
131
+ auto decision = MakeInjectionDecision(call_args.client_initial_metadata);
132
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_fault_injection_filter_trace)) {
133
+ gpr_log(GPR_INFO, "chand=%p: Fault injection triggered %s", this,
134
+ decision.ToString().c_str());
287
135
  }
288
- // Chain to the next filter.
289
- grpc_call_next_op(elem, batch);
136
+ auto delay = decision.DelayUntil();
137
+ return TrySeq(
138
+ Sleep(delay),
139
+ Capture(
140
+ [](InjectionDecision* decision) { return decision->MaybeAbort(); },
141
+ std::move(decision)),
142
+ next_promise_factory(std::move(call_args)));
290
143
  }
291
144
 
292
- CallData::CallData(grpc_call_element* elem, const grpc_call_element_args* args)
293
- : owning_call_(args->call_stack),
294
- arena_(args->arena),
295
- call_combiner_(args->call_combiner) {
296
- auto* chand = static_cast<ChannelData*>(elem->channel_data);
145
+ FaultInjectionFilter::InjectionDecision
146
+ FaultInjectionFilter::MakeInjectionDecision(
147
+ const ClientMetadataHandle& initial_metadata) {
297
148
  // Fetch the fault injection policy from the service config, based on the
298
149
  // relative index for which policy should this CallData use.
299
150
  auto* service_config_call_data = static_cast<ServiceConfigCallData*>(
300
- args->context[GRPC_CONTEXT_SERVICE_CONFIG_CALL_DATA].value);
151
+ GetContext<
152
+ grpc_call_context_element>()[GRPC_CONTEXT_SERVICE_CONFIG_CALL_DATA]
153
+ .value);
301
154
  auto* method_params = static_cast<FaultInjectionMethodParsedConfig*>(
302
155
  service_config_call_data->GetMethodParsedConfig(
303
- chand->service_config_parser_index()));
156
+ service_config_parser_index_));
157
+ const FaultInjectionMethodParsedConfig::FaultInjectionPolicy* fi_policy =
158
+ nullptr;
304
159
  if (method_params != nullptr) {
305
- fi_policy_ = method_params->fault_injection_policy(chand->index());
160
+ fi_policy = method_params->fault_injection_policy(index_);
306
161
  }
307
- GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready_,
308
- HijackedRecvTrailingMetadataReady, elem,
309
- grpc_schedule_on_exec_ctx);
310
- }
311
162
 
312
- CallData::~CallData() {
313
- if (fi_policy_owned_) {
314
- fi_policy_->~FaultInjectionPolicy();
315
- }
316
- GRPC_ERROR_UNREF(abort_error_);
317
- }
163
+ grpc_status_code abort_code = fi_policy->abort_code;
164
+ uint32_t abort_percentage_numerator = fi_policy->abort_percentage_numerator;
165
+ uint32_t delay_percentage_numerator = fi_policy->delay_percentage_numerator;
166
+ Duration delay = fi_policy->delay;
318
167
 
319
- void CallData::DecideWhetherToInjectFaults(
320
- grpc_metadata_batch* initial_metadata) {
321
- FaultInjectionMethodParsedConfig::FaultInjectionPolicy* copied_policy =
322
- nullptr;
323
168
  // Update the policy with values in initial metadata.
324
- if (!fi_policy_->abort_code_header.empty() ||
325
- !fi_policy_->abort_percentage_header.empty() ||
326
- !fi_policy_->delay_header.empty() ||
327
- !fi_policy_->delay_percentage_header.empty()) {
328
- // Defer the actual copy until the first matched header.
329
- auto maybe_copy_policy_func = [this, &copied_policy]() {
330
- if (copied_policy == nullptr) {
331
- copied_policy =
332
- arena_->New<FaultInjectionMethodParsedConfig::FaultInjectionPolicy>(
333
- *fi_policy_);
334
- }
335
- };
169
+ if (!fi_policy->abort_code_header.empty() ||
170
+ !fi_policy->abort_percentage_header.empty() ||
171
+ !fi_policy->delay_header.empty() ||
172
+ !fi_policy->delay_percentage_header.empty()) {
336
173
  std::string buffer;
337
- if (!fi_policy_->abort_code_header.empty() &&
338
- (copied_policy == nullptr ||
339
- copied_policy->abort_code == GRPC_STATUS_OK)) {
174
+ if (!fi_policy->abort_code_header.empty() && abort_code == GRPC_STATUS_OK) {
340
175
  auto value = initial_metadata->GetStringValue(
341
- fi_policy_->abort_code_header, &buffer);
176
+ fi_policy->abort_code_header, &buffer);
342
177
  if (value.has_value()) {
343
- maybe_copy_policy_func();
344
178
  grpc_status_code_from_int(
345
- AsInt<int>(*value).value_or(GRPC_STATUS_UNKNOWN),
346
- &copied_policy->abort_code);
179
+ AsInt<int>(*value).value_or(GRPC_STATUS_UNKNOWN), &abort_code);
347
180
  }
348
181
  }
349
- if (!fi_policy_->abort_percentage_header.empty()) {
182
+ if (!fi_policy->abort_percentage_header.empty()) {
350
183
  auto value = initial_metadata->GetStringValue(
351
- fi_policy_->abort_percentage_header, &buffer);
184
+ fi_policy->abort_percentage_header, &buffer);
352
185
  if (value.has_value()) {
353
- maybe_copy_policy_func();
354
- copied_policy->abort_percentage_numerator =
355
- std::min(AsInt<uint32_t>(*value).value_or(-1),
356
- fi_policy_->abort_percentage_numerator);
186
+ abort_percentage_numerator = std::min(
187
+ AsInt<uint32_t>(*value).value_or(-1), abort_percentage_numerator);
357
188
  }
358
189
  }
359
- if (!fi_policy_->delay_header.empty() &&
360
- (copied_policy == nullptr ||
361
- copied_policy->delay == Duration::Zero())) {
190
+ if (!fi_policy->delay_header.empty() && delay == Duration::Zero()) {
362
191
  auto value =
363
- initial_metadata->GetStringValue(fi_policy_->delay_header, &buffer);
192
+ initial_metadata->GetStringValue(fi_policy->delay_header, &buffer);
364
193
  if (value.has_value()) {
365
- maybe_copy_policy_func();
366
- copied_policy->delay = Duration::Milliseconds(
194
+ delay = Duration::Milliseconds(
367
195
  std::max(AsInt<int64_t>(*value).value_or(0), int64_t(0)));
368
196
  }
369
197
  }
370
- if (!fi_policy_->delay_percentage_header.empty()) {
198
+ if (!fi_policy->delay_percentage_header.empty()) {
371
199
  auto value = initial_metadata->GetStringValue(
372
- fi_policy_->delay_percentage_header, &buffer);
200
+ fi_policy->delay_percentage_header, &buffer);
373
201
  if (value.has_value()) {
374
- maybe_copy_policy_func();
375
- copied_policy->delay_percentage_numerator =
376
- std::min(AsInt<uint32_t>(*value).value_or(-1),
377
- fi_policy_->delay_percentage_numerator);
202
+ delay_percentage_numerator = std::min(
203
+ AsInt<uint32_t>(*value).value_or(-1), delay_percentage_numerator);
378
204
  }
379
205
  }
380
- if (copied_policy != nullptr) fi_policy_ = copied_policy;
381
206
  }
382
207
  // Roll the dice
383
- delay_request_ = fi_policy_->delay != Duration::Zero() &&
384
- UnderFraction(fi_policy_->delay_percentage_numerator,
385
- fi_policy_->delay_percentage_denominator);
386
- abort_request_ = fi_policy_->abort_code != GRPC_STATUS_OK &&
387
- UnderFraction(fi_policy_->abort_percentage_numerator,
388
- fi_policy_->abort_percentage_denominator);
389
- if (!delay_request_ && !abort_request_) {
390
- if (copied_policy != nullptr) copied_policy->~FaultInjectionPolicy();
391
- // No fault injection for this call
392
- } else {
393
- fi_policy_owned_ = copied_policy != nullptr;
394
- }
395
- }
396
-
397
- bool CallData::HaveActiveFaultsQuota(bool increment) {
398
- if (g_active_faults.load(std::memory_order_acquire) >=
399
- fi_policy_->max_faults) {
400
- return false;
401
- }
402
- if (increment) g_active_faults.fetch_add(1, std::memory_order_relaxed);
403
- return true;
208
+ const bool delay_request =
209
+ delay != Duration::Zero() &&
210
+ UnderFraction(delay_percentage_numerator,
211
+ fi_policy->delay_percentage_denominator);
212
+ const bool abort_request =
213
+ abort_code != GRPC_STATUS_OK &&
214
+ UnderFraction(abort_percentage_numerator,
215
+ fi_policy->abort_percentage_denominator);
216
+
217
+ return InjectionDecision(
218
+ fi_policy->max_faults, delay_request ? delay : Duration::Zero(),
219
+ abort_request ? absl::optional<absl::Status>(absl::Status(
220
+ static_cast<absl::StatusCode>(abort_code),
221
+ fi_policy->abort_message))
222
+ : absl::nullopt);
404
223
  }
405
224
 
406
- bool CallData::MaybeDelay() {
407
- if (delay_request_) {
408
- return HaveActiveFaultsQuota(true);
409
- }
410
- return false;
225
+ bool FaultInjectionFilter::InjectionDecision::HaveActiveFaultsQuota() const {
226
+ return g_active_faults.load(std::memory_order_acquire) < max_faults_;
411
227
  }
412
228
 
413
- grpc_error_handle CallData::MaybeAbort() {
414
- if (abort_request_ && (delay_request_ || HaveActiveFaultsQuota(false))) {
415
- return grpc_error_set_int(
416
- GRPC_ERROR_CREATE_FROM_COPIED_STRING(fi_policy_->abort_message.c_str()),
417
- GRPC_ERROR_INT_GRPC_STATUS, fi_policy_->abort_code);
229
+ Timestamp FaultInjectionFilter::InjectionDecision::DelayUntil() {
230
+ if (delay_time_ != Duration::Zero() && HaveActiveFaultsQuota()) {
231
+ active_fault_ = FaultHandle{true};
232
+ return ExecCtx::Get()->Now() + delay_time_;
418
233
  }
419
- return GRPC_ERROR_NONE;
420
- }
421
-
422
- void CallData::DelayBatch(grpc_call_element* elem,
423
- grpc_transport_stream_op_batch* batch) {
424
- MutexLock lock(&delay_mu_);
425
- delayed_batch_ = batch;
426
- resume_batch_canceller_ = new ResumeBatchCanceller(elem);
427
- Timestamp resume_time = ExecCtx::Get()->Now() + fi_policy_->delay;
428
- GRPC_CLOSURE_INIT(&batch->handler_private.closure, ResumeBatch, elem,
429
- grpc_schedule_on_exec_ctx);
430
- grpc_timer_init(&delay_timer_, resume_time, &batch->handler_private.closure);
234
+ return Timestamp::InfPast();
431
235
  }
432
236
 
433
- void CallData::ResumeBatch(void* arg, grpc_error_handle error) {
434
- grpc_call_element* elem = static_cast<grpc_call_element*>(arg);
435
- auto* calld = static_cast<CallData*>(elem->call_data);
436
- MutexLock lock(&calld->delay_mu_);
437
- // Cancelled or canceller has already run
438
- if (error == GRPC_ERROR_CANCELLED ||
439
- calld->resume_batch_canceller_ == nullptr) {
440
- return;
441
- }
442
- if (GRPC_TRACE_FLAG_ENABLED(grpc_fault_injection_filter_trace)) {
443
- gpr_log(GPR_INFO, "chand=%p calld=%p: Resuming delayed stream op batch %p",
444
- elem->channel_data, calld, calld->delayed_batch_);
445
- }
446
- // Lame the canceller
447
- calld->resume_batch_canceller_ = nullptr;
448
- // Finish fault injection.
449
- calld->FaultInjectionFinished();
450
- // Abort if needed.
451
- error = calld->MaybeAbort();
452
- if (error != GRPC_ERROR_NONE) {
453
- calld->abort_error_ = error;
454
- grpc_transport_stream_op_batch_finish_with_failure(
455
- calld->delayed_batch_, GRPC_ERROR_REF(calld->abort_error_),
456
- calld->call_combiner_);
457
- return;
237
+ absl::Status FaultInjectionFilter::InjectionDecision::MaybeAbort() const {
238
+ if (abort_request_.has_value() &&
239
+ (delay_time_ != Duration::Zero() || HaveActiveFaultsQuota())) {
240
+ return abort_request_.value();
458
241
  }
459
- // Chain to the next filter.
460
- grpc_call_next_op(elem, calld->delayed_batch_);
242
+ return absl::OkStatus();
461
243
  }
462
244
 
463
- void CallData::HijackedRecvTrailingMetadataReady(void* arg,
464
- grpc_error_handle error) {
465
- grpc_call_element* elem = static_cast<grpc_call_element*>(arg);
466
- auto* calld = static_cast<CallData*>(elem->call_data);
467
- if (calld->abort_error_ != GRPC_ERROR_NONE) {
468
- error = grpc_error_add_child(GRPC_ERROR_REF(error),
469
- GRPC_ERROR_REF(calld->abort_error_));
470
- } else {
471
- error = GRPC_ERROR_REF(error);
472
- }
473
- Closure::Run(DEBUG_LOCATION, calld->original_recv_trailing_metadata_ready_,
474
- error);
245
+ std::string FaultInjectionFilter::InjectionDecision::ToString() const {
246
+ return absl::StrCat("delay=", delay_time_ != Duration::Zero(),
247
+ " abort=", abort_request_.has_value());
475
248
  }
476
249
 
477
- } // namespace
478
-
479
- extern const grpc_channel_filter FaultInjectionFilterVtable = {
480
- CallData::StartTransportStreamOpBatch,
481
- nullptr,
482
- grpc_channel_next_op,
483
- sizeof(CallData),
484
- CallData::Init,
485
- grpc_call_stack_ignore_set_pollset_or_pollset_set,
486
- CallData::Destroy,
487
- sizeof(ChannelData),
488
- ChannelData::Init,
489
- ChannelData::Destroy,
490
- grpc_channel_next_get_info,
491
- "fault_injection_filter",
492
- };
250
+ const grpc_channel_filter FaultInjectionFilter::kFilter =
251
+ MakePromiseBasedFilter<FaultInjectionFilter, FilterEndpoint::kClient>(
252
+ "fault_injection_filter");
493
253
 
494
254
  void FaultInjectionFilterRegister(CoreConfiguration::Builder* builder) {
495
255
  FaultInjectionServiceConfigParser::Register(builder);
@@ -21,6 +21,8 @@
21
21
 
22
22
  #include "src/core/ext/filters/fault_injection/service_config_parser.h"
23
23
  #include "src/core/lib/channel/channel_stack.h"
24
+ #include "src/core/lib/channel/promise_based_filter.h"
25
+ #include "src/core/lib/transport/transport.h"
24
26
 
25
27
  // Channel arg key for enabling parsing fault injection via method config.
26
28
  #define GRPC_ARG_PARSE_FAULT_INJECTION_METHOD_CONFIG \
@@ -32,7 +34,28 @@ namespace grpc_core {
32
34
  // of the ordinary channel stack. The fault injection filter fetches fault
33
35
  // injection policy from the method config of service config returned by the
34
36
  // resolver, and enforces the fault injection policy.
35
- extern const grpc_channel_filter FaultInjectionFilterVtable;
37
+ class FaultInjectionFilter : public ChannelFilter {
38
+ public:
39
+ static const grpc_channel_filter kFilter;
40
+
41
+ static absl::StatusOr<FaultInjectionFilter> Create(
42
+ ChannelArgs args, ChannelFilter::Args filter_args);
43
+
44
+ // Construct a promise for one call.
45
+ ArenaPromise<ServerMetadataHandle> MakeCallPromise(
46
+ CallArgs call_args, NextPromiseFactory next_promise_factory) override;
47
+
48
+ private:
49
+ explicit FaultInjectionFilter(ChannelFilter::Args filter_args);
50
+
51
+ class InjectionDecision;
52
+ InjectionDecision MakeInjectionDecision(
53
+ const ClientMetadataHandle& initial_metadata);
54
+
55
+ // The relative index of instances of the same filter.
56
+ int index_;
57
+ const size_t service_config_parser_index_;
58
+ };
36
59
 
37
60
  } // namespace grpc_core
38
61