grpc 1.35.0.pre1 → 1.37.1

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 (507) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +121 -89
  3. data/include/grpc/grpc.h +15 -1
  4. data/include/grpc/grpc_security.h +16 -11
  5. data/include/grpc/impl/codegen/port_platform.h +2 -0
  6. data/src/core/ext/filters/client_channel/client_channel.cc +359 -331
  7. data/src/core/ext/filters/client_channel/client_channel.h +0 -2
  8. data/src/core/ext/filters/client_channel/client_channel_factory.h +2 -1
  9. data/src/core/ext/filters/client_channel/config_selector.h +9 -1
  10. data/src/core/ext/filters/client_channel/dynamic_filters.cc +9 -4
  11. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +24 -142
  12. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +15 -10
  13. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +2 -2
  14. data/src/core/ext/filters/client_channel/lb_policy.cc +3 -0
  15. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +3 -5
  16. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -2
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -2
  18. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +1 -1
  19. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +8 -6
  20. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +23 -0
  21. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +27 -0
  22. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +289 -170
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +5 -0
  24. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +8 -25
  25. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +1 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +232 -110
  27. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +27 -67
  28. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +10 -9
  29. data/src/core/ext/filters/client_channel/resolver.cc +5 -5
  30. data/src/core/ext/filters/client_channel/resolver.h +1 -12
  31. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +36 -45
  32. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  33. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -1
  34. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +34 -50
  35. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +16 -14
  36. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +18 -15
  37. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +377 -0
  38. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -4
  39. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +307 -155
  40. data/src/core/ext/filters/client_channel/server_address.cc +9 -0
  41. data/src/core/ext/filters/client_channel/server_address.h +31 -0
  42. data/src/core/ext/filters/client_channel/subchannel.cc +69 -146
  43. data/src/core/ext/filters/client_channel/subchannel.h +63 -95
  44. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +16 -2
  45. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +10 -8
  46. data/src/core/ext/filters/client_idle/client_idle_filter.cc +1 -1
  47. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +500 -0
  48. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +39 -0
  49. data/src/core/ext/filters/fault_injection/service_config_parser.cc +189 -0
  50. data/src/core/ext/filters/fault_injection/service_config_parser.h +85 -0
  51. data/src/core/ext/filters/max_age/max_age_filter.cc +35 -32
  52. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +1 -1
  53. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -2
  54. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +3 -2
  55. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +1 -1
  56. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +3 -2
  57. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +490 -178
  58. data/src/core/ext/transport/chttp2/server/chttp2_server.h +11 -2
  59. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +11 -1
  60. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +1 -1
  61. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +62 -18
  62. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +39 -7
  63. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +12 -1
  64. data/src/core/ext/transport/chttp2/transport/frame_data.cc +5 -1
  65. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +1 -1
  66. data/src/core/ext/transport/chttp2/transport/internal.h +1 -0
  67. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +406 -0
  68. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +1459 -0
  69. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +0 -1
  70. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +350 -0
  71. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +1348 -0
  72. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +11 -16
  73. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +42 -59
  74. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +3 -2
  75. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +15 -0
  76. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +25 -1
  77. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +75 -0
  78. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +2 -2
  79. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +9 -9
  80. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +7 -7
  81. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +28 -13
  82. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +6 -0
  83. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +25 -0
  84. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +0 -1
  85. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +11 -5
  86. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +41 -7
  87. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +0 -1
  88. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +23 -21
  89. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +122 -77
  90. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +13 -9
  91. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +37 -5
  92. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +0 -1
  93. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +144 -0
  94. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +488 -0
  95. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +141 -0
  96. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +452 -0
  97. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +11 -9
  98. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +44 -27
  99. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +57 -16
  100. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +150 -0
  101. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +0 -1
  102. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +29 -0
  103. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +67 -0
  104. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +79 -0
  105. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +268 -0
  106. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +78 -0
  107. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +281 -0
  108. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +41 -0
  109. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +113 -0
  110. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +19 -21
  111. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +64 -51
  112. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +0 -1
  113. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +16 -13
  114. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +50 -18
  115. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +4 -7
  116. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +0 -17
  117. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +0 -1
  118. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +30 -23
  119. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +85 -73
  120. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +0 -3
  121. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +0 -3
  122. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +0 -1
  123. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +0 -2
  124. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +93 -0
  125. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +323 -0
  126. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +36 -0
  127. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +90 -0
  128. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +0 -1
  129. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +46 -0
  130. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +124 -0
  131. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +21 -4
  132. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +29 -0
  133. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.c +33 -0
  134. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +77 -0
  135. data/src/core/ext/upb-generated/{udpa/core/v1 → xds/core/v3}/authority.upb.c +5 -5
  136. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +60 -0
  137. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +52 -0
  138. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +143 -0
  139. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +42 -0
  140. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +84 -0
  141. data/src/core/ext/upb-generated/{udpa/core/v1 → xds/core/v3}/resource.upb.c +9 -9
  142. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +94 -0
  143. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +54 -0
  144. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +166 -0
  145. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +36 -0
  146. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +85 -0
  147. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +354 -0
  148. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +140 -0
  149. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +168 -171
  150. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +383 -0
  151. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +115 -0
  152. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +405 -420
  153. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +2 -2
  154. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +12 -9
  155. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +177 -171
  156. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +10 -0
  157. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +88 -88
  158. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +153 -153
  159. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +10 -7
  160. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +5 -0
  161. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +4 -7
  162. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +33 -20
  163. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +56 -59
  164. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +116 -111
  165. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +129 -121
  166. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +21 -24
  167. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +141 -0
  168. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h +70 -0
  169. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +141 -0
  170. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +70 -0
  171. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +17 -13
  172. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +753 -724
  173. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +10 -0
  174. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +22 -25
  175. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +51 -0
  176. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +35 -0
  177. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +102 -0
  178. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.h +55 -0
  179. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +120 -0
  180. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h +45 -0
  181. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +76 -0
  182. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +35 -0
  183. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +371 -377
  184. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +12 -16
  185. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +112 -108
  186. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +45 -53
  187. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +177 -180
  188. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +92 -102
  189. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +5 -0
  190. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +32 -42
  191. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +30 -40
  192. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +4 -7
  193. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +38 -44
  194. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +130 -0
  195. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +50 -0
  196. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +56 -0
  197. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h +35 -0
  198. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +30 -33
  199. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +63 -0
  200. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.h +40 -0
  201. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +8 -7
  202. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +9 -9
  203. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +9 -8
  204. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +8 -8
  205. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +8 -8
  206. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +9 -8
  207. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +8 -8
  208. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +44 -0
  209. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +35 -0
  210. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +14 -11
  211. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +42 -0
  212. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h +35 -0
  213. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +62 -0
  214. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h +40 -0
  215. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +45 -0
  216. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h +40 -0
  217. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +49 -0
  218. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h +35 -0
  219. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +67 -0
  220. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h +40 -0
  221. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +50 -0
  222. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h +35 -0
  223. data/src/core/ext/xds/xds_api.cc +2149 -666
  224. data/src/core/ext/xds/xds_api.h +321 -119
  225. data/src/core/ext/xds/xds_bootstrap.cc +80 -45
  226. data/src/core/ext/xds/xds_bootstrap.h +17 -5
  227. data/src/core/ext/xds/xds_certificate_provider.cc +180 -74
  228. data/src/core/ext/xds/xds_certificate_provider.h +83 -44
  229. data/src/core/ext/xds/xds_client.cc +181 -34
  230. data/src/core/ext/xds/xds_client.h +29 -0
  231. data/src/core/ext/xds/xds_client_stats.cc +2 -1
  232. data/src/core/ext/xds/xds_client_stats.h +2 -2
  233. data/src/core/ext/xds/xds_http_fault_filter.cc +226 -0
  234. data/src/core/ext/xds/xds_http_fault_filter.h +63 -0
  235. data/src/core/ext/xds/xds_http_filters.cc +114 -0
  236. data/src/core/ext/xds/xds_http_filters.h +130 -0
  237. data/src/core/ext/xds/xds_server_config_fetcher.cc +425 -24
  238. data/src/core/lib/channel/channel_stack.cc +12 -0
  239. data/src/core/lib/channel/channel_stack.h +7 -0
  240. data/src/core/lib/channel/channelz.cc +92 -4
  241. data/src/core/lib/channel/channelz.h +30 -1
  242. data/src/core/lib/channel/channelz_registry.cc +14 -0
  243. data/src/core/lib/channel/handshaker.cc +2 -44
  244. data/src/core/lib/channel/handshaker.h +1 -18
  245. data/src/core/lib/channel/status_util.cc +12 -2
  246. data/src/core/lib/channel/status_util.h +5 -0
  247. data/src/core/lib/gpr/log.cc +6 -1
  248. data/src/core/lib/gpr/sync_abseil.cc +3 -6
  249. data/src/core/lib/gpr/sync_windows.cc +2 -2
  250. data/src/core/lib/gprpp/atomic.h +3 -3
  251. data/src/core/lib/gprpp/dual_ref_counted.h +3 -3
  252. data/src/core/lib/gprpp/mpscq.cc +2 -2
  253. data/src/core/lib/gprpp/ref_counted.h +1 -1
  254. data/src/core/lib/gprpp/ref_counted_ptr.h +2 -0
  255. data/src/core/lib/gprpp/sync.h +129 -40
  256. data/src/core/lib/gprpp/thd.h +1 -1
  257. data/src/core/lib/gprpp/time_util.cc +77 -0
  258. data/src/core/lib/gprpp/time_util.h +42 -0
  259. data/src/core/lib/http/httpcli_security_connector.cc +2 -2
  260. data/src/core/lib/iomgr/buffer_list.h +1 -1
  261. data/src/core/lib/iomgr/cfstream_handle.cc +2 -2
  262. data/src/core/lib/iomgr/error.h +1 -1
  263. data/src/core/lib/iomgr/ev_apple.cc +11 -8
  264. data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -3
  265. data/src/core/lib/iomgr/ev_epollex_linux.cc +4 -4
  266. data/src/core/lib/iomgr/ev_posix.cc +3 -3
  267. data/src/core/lib/iomgr/exec_ctx.cc +6 -2
  268. data/src/core/lib/iomgr/iomgr_posix.cc +0 -1
  269. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +0 -1
  270. data/src/core/lib/iomgr/resource_quota.cc +1 -1
  271. data/src/core/lib/iomgr/sockaddr_utils.cc +121 -1
  272. data/src/core/lib/iomgr/sockaddr_utils.h +25 -0
  273. data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -0
  274. data/src/core/lib/iomgr/tcp_client_posix.cc +1 -1
  275. data/src/core/lib/iomgr/tcp_posix.cc +5 -8
  276. data/src/core/lib/iomgr/tcp_uv.cc +2 -2
  277. data/src/core/lib/iomgr/timer_generic.cc +2 -2
  278. data/src/core/lib/iomgr/timer_manager.cc +1 -1
  279. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +1 -1
  280. data/src/core/lib/matchers/matchers.cc +339 -0
  281. data/src/core/lib/matchers/matchers.h +160 -0
  282. data/src/core/lib/security/credentials/alts/alts_credentials.cc +2 -1
  283. data/src/core/lib/security/credentials/alts/alts_credentials.h +1 -1
  284. data/src/core/lib/security/credentials/credentials.h +2 -1
  285. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +1 -1
  286. data/src/core/lib/security/credentials/external/external_account_credentials.cc +2 -2
  287. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +1 -1
  288. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +1 -1
  289. data/src/core/lib/security/credentials/fake/fake_credentials.cc +1 -1
  290. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +7 -6
  291. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +2 -2
  292. data/src/core/lib/security/credentials/jwt/json_token.cc +0 -3
  293. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +0 -3
  294. data/src/core/lib/security/credentials/local/local_credentials.cc +2 -1
  295. data/src/core/lib/security/credentials/local/local_credentials.h +1 -1
  296. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +2 -1
  297. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +1 -1
  298. data/src/core/lib/security/credentials/tls/tls_credentials.cc +2 -1
  299. data/src/core/lib/security/credentials/tls/tls_credentials.h +1 -1
  300. data/src/core/lib/security/credentials/xds/xds_credentials.cc +128 -59
  301. data/src/core/lib/security/credentials/xds/xds_credentials.h +3 -3
  302. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +5 -5
  303. data/src/core/lib/security/security_connector/ssl_utils.cc +9 -4
  304. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +32 -14
  305. data/src/core/lib/security/transport/security_handshaker.cc +33 -5
  306. data/src/core/lib/security/transport/server_auth_filter.cc +7 -0
  307. data/src/core/lib/slice/slice_intern.cc +5 -6
  308. data/src/core/lib/surface/channel.h +3 -3
  309. data/src/core/lib/surface/completion_queue.cc +1 -1
  310. data/src/core/lib/surface/init.cc +13 -15
  311. data/src/core/lib/surface/lame_client.cc +38 -19
  312. data/src/core/lib/surface/lame_client.h +4 -3
  313. data/src/core/lib/surface/server.cc +43 -36
  314. data/src/core/lib/surface/server.h +76 -14
  315. data/src/core/lib/surface/version.cc +2 -2
  316. data/src/core/lib/transport/metadata.cc +6 -2
  317. data/src/core/lib/transport/metadata_batch.cc +27 -0
  318. data/src/core/lib/transport/metadata_batch.h +14 -0
  319. data/src/core/plugin_registry/grpc_plugin_registry.cc +12 -0
  320. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +18 -24
  321. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +16 -21
  322. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +1 -1
  323. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -3
  324. data/src/core/tsi/fake_transport_security.cc +11 -2
  325. data/src/core/tsi/ssl/session_cache/ssl_session.h +0 -3
  326. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +0 -2
  327. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +2 -4
  328. data/src/core/tsi/ssl_transport_security.cc +0 -3
  329. data/src/core/tsi/ssl_transport_security.h +0 -3
  330. data/src/ruby/ext/grpc/extconf.rb +9 -1
  331. data/src/ruby/ext/grpc/rb_channel.c +10 -1
  332. data/src/ruby/ext/grpc/rb_channel_credentials.c +11 -1
  333. data/src/ruby/ext/grpc/rb_channel_credentials.h +4 -0
  334. data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
  335. data/src/ruby/ext/grpc/rb_enable_cpp.cc +1 -1
  336. data/src/ruby/ext/grpc/rb_grpc.c +4 -0
  337. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  338. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -1
  339. data/src/ruby/ext/grpc/rb_server.c +13 -1
  340. data/src/ruby/ext/grpc/rb_server_credentials.c +19 -3
  341. data/src/ruby/ext/grpc/rb_server_credentials.h +4 -0
  342. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +215 -0
  343. data/src/ruby/ext/grpc/rb_xds_channel_credentials.h +35 -0
  344. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +169 -0
  345. data/src/ruby/ext/grpc/rb_xds_server_credentials.h +35 -0
  346. data/src/ruby/lib/grpc/generic/client_stub.rb +4 -2
  347. data/src/ruby/lib/grpc/version.rb +1 -1
  348. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +7 -0
  349. data/src/ruby/spec/call_spec.rb +1 -1
  350. data/src/ruby/spec/channel_credentials_spec.rb +32 -0
  351. data/src/ruby/spec/channel_spec.rb +17 -6
  352. data/src/ruby/spec/client_auth_spec.rb +27 -1
  353. data/src/ruby/spec/errors_spec.rb +1 -1
  354. data/src/ruby/spec/generic/active_call_spec.rb +2 -2
  355. data/src/ruby/spec/generic/client_stub_spec.rb +4 -4
  356. data/src/ruby/spec/generic/rpc_server_spec.rb +1 -1
  357. data/src/ruby/spec/server_credentials_spec.rb +25 -0
  358. data/src/ruby/spec/server_spec.rb +22 -0
  359. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +1 -0
  360. data/third_party/boringssl-with-bazel/err_data.c +715 -713
  361. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +3 -3
  362. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +2 -2
  363. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +5 -5
  364. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +3 -10
  365. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c +3 -3
  366. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +4 -2
  367. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +2 -2
  368. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +15 -14
  369. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +30 -0
  370. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +28 -79
  371. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +39 -85
  372. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +5 -16
  373. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +10 -61
  374. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +0 -2
  375. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +2 -2
  376. data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +4 -0
  377. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +158 -0
  378. data/third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c +3 -10
  379. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +8 -9
  380. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +60 -45
  381. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c +6 -81
  382. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +87 -0
  383. data/third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-win.c +41 -0
  384. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +11 -2
  385. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm.c +3 -3
  386. data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/dh_asn1.c +0 -0
  387. data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/params.c +179 -0
  388. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +25 -0
  389. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c +2 -17
  390. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +3 -1
  391. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn.c +13 -20
  392. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +2 -3
  393. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +9 -1
  394. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +21 -13
  395. data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/check.c +0 -0
  396. data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/dh.c +136 -213
  397. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +12 -0
  398. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +9 -1
  399. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +28 -0
  400. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +135 -43
  401. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +0 -7
  402. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +51 -32
  403. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +147 -0
  404. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +18 -29
  405. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +13 -4
  406. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +10 -7
  407. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c +13 -11
  408. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c +4 -0
  409. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c +34 -0
  410. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +4 -0
  411. data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +7 -13
  412. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +5 -1
  413. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +1 -29
  414. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +10 -7
  415. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c +1 -1
  416. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +8 -8
  417. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +1 -1
  418. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +29 -23
  419. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +22 -17
  420. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +1 -2
  421. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c +2 -2
  422. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +39 -4
  423. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +2 -2
  424. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +3 -3
  425. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +11 -10
  426. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -3
  427. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +25 -25
  428. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -2
  429. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +2 -1
  430. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +40 -20
  431. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c +3 -4
  432. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +25 -36
  433. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +1 -1
  434. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +6 -6
  435. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +6 -6
  436. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +3 -3
  437. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +652 -545
  438. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +0 -167
  439. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +10 -5
  440. data/third_party/boringssl-with-bazel/src/include/openssl/blake2.h +62 -0
  441. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +22 -7
  442. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +19 -0
  443. data/third_party/boringssl-with-bazel/src/include/openssl/cpu.h +22 -32
  444. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +56 -26
  445. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +1 -0
  446. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +15 -0
  447. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +12 -2
  448. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +3 -0
  449. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +2 -1
  450. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +67 -33
  451. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +27 -8
  452. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +287 -99
  453. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +139 -36
  454. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +4 -3
  455. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +11 -20
  456. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +10 -5
  457. data/third_party/boringssl-with-bazel/src/ssl/internal.h +37 -16
  458. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +0 -1
  459. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +7 -8
  460. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +20 -14
  461. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +7 -8
  462. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +2 -2
  463. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +5 -7
  464. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +362 -50
  465. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +2 -2
  466. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +48 -15
  467. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +66 -24
  468. data/third_party/xxhash/xxhash.h +5443 -0
  469. metadata +140 -84
  470. data/src/core/ext/upb-generated/udpa/core/v1/authority.upb.h +0 -60
  471. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c +0 -52
  472. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h +0 -143
  473. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c +0 -42
  474. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h +0 -84
  475. data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.h +0 -94
  476. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c +0 -54
  477. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h +0 -173
  478. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c +0 -36
  479. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h +0 -92
  480. data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c +0 -42
  481. data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h +0 -35
  482. data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c +0 -62
  483. data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h +0 -40
  484. data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c +0 -45
  485. data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h +0 -40
  486. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c +0 -49
  487. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h +0 -35
  488. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c +0 -68
  489. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h +0 -40
  490. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c +0 -51
  491. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h +0 -35
  492. data/src/core/lib/iomgr/iomgr_posix.h +0 -26
  493. data/src/core/lib/security/authorization/authorization_engine.cc +0 -177
  494. data/src/core/lib/security/authorization/authorization_engine.h +0 -84
  495. data/src/core/lib/security/authorization/evaluate_args.cc +0 -148
  496. data/src/core/lib/security/authorization/evaluate_args.h +0 -59
  497. data/src/core/lib/security/authorization/mock_cel/activation.h +0 -57
  498. data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +0 -44
  499. data/src/core/lib/security/authorization/mock_cel/cel_expression.h +0 -69
  500. data/src/core/lib/security/authorization/mock_cel/cel_value.h +0 -97
  501. data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +0 -67
  502. data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +0 -57
  503. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +0 -504
  504. data/third_party/upb/upb/json_decode.c +0 -1443
  505. data/third_party/upb/upb/json_decode.h +0 -23
  506. data/third_party/upb/upb/json_encode.c +0 -713
  507. data/third_party/upb/upb/json_encode.h +0 -36
@@ -30,6 +30,7 @@
30
30
  #include "src/core/lib/channel/channel_stack.h"
31
31
  #include "src/core/lib/gpr/time_precise.h"
32
32
  #include "src/core/lib/gprpp/arena.h"
33
+ #include "src/core/lib/gprpp/dual_ref_counted.h"
33
34
  #include "src/core/lib/gprpp/ref_counted.h"
34
35
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
35
36
  #include "src/core/lib/gprpp/sync.h"
@@ -41,31 +42,6 @@
41
42
  // Channel arg containing a URI indicating the address to connect to.
42
43
  #define GRPC_ARG_SUBCHANNEL_ADDRESS "grpc.subchannel_address"
43
44
 
44
- // For debugging refcounting.
45
- #ifndef NDEBUG
46
- #define GRPC_SUBCHANNEL_REF(p, r) (p)->Ref(__FILE__, __LINE__, (r))
47
- #define GRPC_SUBCHANNEL_REF_FROM_WEAK_REF(p, r) (p)->RefFromWeakRef()
48
- #define GRPC_SUBCHANNEL_UNREF(p, r) (p)->Unref(__FILE__, __LINE__, (r))
49
- #define GRPC_SUBCHANNEL_WEAK_REF(p, r) (p)->WeakRef(__FILE__, __LINE__, (r))
50
- #define GRPC_SUBCHANNEL_WEAK_UNREF(p, r) (p)->WeakUnref(__FILE__, __LINE__, (r))
51
- #define GRPC_SUBCHANNEL_REF_EXTRA_ARGS \
52
- const char *file, int line, const char *reason
53
- #define GRPC_SUBCHANNEL_REF_REASON reason
54
- #define GRPC_SUBCHANNEL_REF_MUTATE_EXTRA_ARGS \
55
- , GRPC_SUBCHANNEL_REF_EXTRA_ARGS, const char* purpose
56
- #define GRPC_SUBCHANNEL_REF_MUTATE_PURPOSE(x) , file, line, reason, x
57
- #else
58
- #define GRPC_SUBCHANNEL_REF(p, r) (p)->Ref()
59
- #define GRPC_SUBCHANNEL_REF_FROM_WEAK_REF(p, r) (p)->RefFromWeakRef()
60
- #define GRPC_SUBCHANNEL_UNREF(p, r) (p)->Unref()
61
- #define GRPC_SUBCHANNEL_WEAK_REF(p, r) (p)->WeakRef()
62
- #define GRPC_SUBCHANNEL_WEAK_UNREF(p, r) (p)->WeakUnref()
63
- #define GRPC_SUBCHANNEL_REF_EXTRA_ARGS
64
- #define GRPC_SUBCHANNEL_REF_REASON ""
65
- #define GRPC_SUBCHANNEL_REF_MUTATE_EXTRA_ARGS
66
- #define GRPC_SUBCHANNEL_REF_MUTATE_PURPOSE(x)
67
- #endif
68
-
69
45
  namespace grpc_core {
70
46
 
71
47
  class SubchannelCall;
@@ -168,7 +144,7 @@ class SubchannelCall {
168
144
  // different from the SubchannelInterface that is exposed to LB policy
169
145
  // implementations. The client channel provides an adaptor class
170
146
  // (SubchannelWrapper) that "converts" between the two.
171
- class Subchannel {
147
+ class Subchannel : public DualRefCounted<Subchannel> {
172
148
  public:
173
149
  class ConnectivityStateWatcherInterface
174
150
  : public RefCounted<ConnectivityStateWatcherInterface> {
@@ -204,37 +180,29 @@ class Subchannel {
204
180
  ConnectivityStateChange PopConnectivityStateChange();
205
181
 
206
182
  private:
183
+ Mutex mu_; // protects the queue
207
184
  // Keeps track of the updates that the watcher instance must be notified of.
208
185
  // TODO(yashkt): This is currently needed to send the state updates in the
209
186
  // right order when asynchronously notifying. This will no longer be
210
187
  // necessary when we have access to EventManager.
211
- std::deque<ConnectivityStateChange> connectivity_state_queue_;
212
- Mutex mu_; // protects the queue
188
+ std::deque<ConnectivityStateChange> connectivity_state_queue_
189
+ ABSL_GUARDED_BY(&mu_);
213
190
  };
214
191
 
192
+ // Creates a subchannel given \a connector and \a args.
193
+ static RefCountedPtr<Subchannel> Create(
194
+ OrphanablePtr<SubchannelConnector> connector,
195
+ const grpc_channel_args* args);
196
+
215
197
  // The ctor and dtor are not intended to use directly.
216
- Subchannel(SubchannelKey* key, OrphanablePtr<SubchannelConnector> connector,
198
+ Subchannel(SubchannelKey key, OrphanablePtr<SubchannelConnector> connector,
217
199
  const grpc_channel_args* args);
218
- ~Subchannel();
219
-
220
- // Creates a subchannel given \a connector and \a args.
221
- static Subchannel* Create(OrphanablePtr<SubchannelConnector> connector,
222
- const grpc_channel_args* args);
200
+ ~Subchannel() override;
223
201
 
224
202
  // Throttles keepalive time to \a new_keepalive_time iff \a new_keepalive_time
225
203
  // is larger than the subchannel's current keepalive time. The updated value
226
204
  // will have an affect when the subchannel creates a new ConnectedSubchannel.
227
- void ThrottleKeepaliveTime(int new_keepalive_time);
228
-
229
- // Strong and weak refcounting.
230
- Subchannel* Ref(GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
231
- void Unref(GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
232
- Subchannel* WeakRef(GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
233
- void WeakUnref(GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
234
- // Attempts to return a strong ref when only the weak refcount is guaranteed
235
- // non-zero. If the strong refcount is zero, does not alter the refcount and
236
- // returns null.
237
- Subchannel* RefFromWeakRef();
205
+ void ThrottleKeepaliveTime(int new_keepalive_time) ABSL_LOCKS_EXCLUDED(mu_);
238
206
 
239
207
  // Gets the string representing the subchannel address.
240
208
  // Caller doesn't take ownership.
@@ -251,7 +219,8 @@ class Subchannel {
251
219
  // If the return value is GRPC_CHANNEL_READY, also sets *connected_subchannel.
252
220
  grpc_connectivity_state CheckConnectivityState(
253
221
  const absl::optional<std::string>& health_check_service_name,
254
- RefCountedPtr<ConnectedSubchannel>* connected_subchannel);
222
+ RefCountedPtr<ConnectedSubchannel>* connected_subchannel)
223
+ ABSL_LOCKS_EXCLUDED(mu_);
255
224
 
256
225
  // Starts watching the subchannel's connectivity state.
257
226
  // The first callback to the watcher will be delivered when the
@@ -264,23 +233,27 @@ class Subchannel {
264
233
  void WatchConnectivityState(
265
234
  grpc_connectivity_state initial_state,
266
235
  const absl::optional<std::string>& health_check_service_name,
267
- RefCountedPtr<ConnectivityStateWatcherInterface> watcher);
236
+ RefCountedPtr<ConnectivityStateWatcherInterface> watcher)
237
+ ABSL_LOCKS_EXCLUDED(mu_);
268
238
 
269
239
  // Cancels a connectivity state watch.
270
240
  // If the watcher has already been destroyed, this is a no-op.
271
241
  void CancelConnectivityStateWatch(
272
242
  const absl::optional<std::string>& health_check_service_name,
273
- ConnectivityStateWatcherInterface* watcher);
243
+ ConnectivityStateWatcherInterface* watcher) ABSL_LOCKS_EXCLUDED(mu_);
274
244
 
275
245
  // Attempt to connect to the backend. Has no effect if already connected.
276
- void AttemptToConnect();
246
+ void AttemptToConnect() ABSL_LOCKS_EXCLUDED(mu_);
277
247
 
278
248
  // Resets the connection backoff of the subchannel.
279
249
  // TODO(roth): Move connection backoff out of subchannels and up into LB
280
250
  // policy code (probably by adding a SubchannelGroup between
281
251
  // SubchannelList and SubchannelData), at which point this method can
282
252
  // go away.
283
- void ResetBackoff();
253
+ void ResetBackoff() ABSL_LOCKS_EXCLUDED(mu_);
254
+
255
+ // Tears down any existing connection, and arranges for destruction
256
+ void Orphan() override ABSL_LOCKS_EXCLUDED(mu_);
284
257
 
285
258
  // Returns a new channel arg encoding the subchannel address as a URI
286
259
  // string. Caller is responsible for freeing the string.
@@ -333,18 +306,20 @@ class Subchannel {
333
306
  class HealthWatcherMap {
334
307
  public:
335
308
  void AddWatcherLocked(
336
- Subchannel* subchannel, grpc_connectivity_state initial_state,
309
+ WeakRefCountedPtr<Subchannel> subchannel,
310
+ grpc_connectivity_state initial_state,
337
311
  const std::string& health_check_service_name,
338
312
  RefCountedPtr<ConnectivityStateWatcherInterface> watcher);
339
313
  void RemoveWatcherLocked(const std::string& health_check_service_name,
340
314
  ConnectivityStateWatcherInterface* watcher);
341
315
 
342
316
  // Notifies the watcher when the subchannel's state changes.
343
- void NotifyLocked(grpc_connectivity_state state,
344
- const absl::Status& status);
317
+ void NotifyLocked(grpc_connectivity_state state, const absl::Status& status)
318
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&Subchannel::mu_);
345
319
 
346
320
  grpc_connectivity_state CheckConnectivityStateLocked(
347
- Subchannel* subchannel, const std::string& health_check_service_name);
321
+ Subchannel* subchannel, const std::string& health_check_service_name)
322
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&Subchannel::mu_);
348
323
 
349
324
  void ShutdownLocked();
350
325
 
@@ -360,72 +335,65 @@ class Subchannel {
360
335
 
361
336
  // Sets the subchannel's connectivity state to \a state.
362
337
  void SetConnectivityStateLocked(grpc_connectivity_state state,
363
- const absl::Status& status);
338
+ const absl::Status& status)
339
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
364
340
 
365
341
  // Methods for connection.
366
- void MaybeStartConnectingLocked();
367
- static void OnRetryAlarm(void* arg, grpc_error* error);
368
- void ContinueConnectingLocked();
369
- static void OnConnectingFinished(void* arg, grpc_error* error);
370
- bool PublishTransportLocked();
371
- void Disconnect();
372
-
373
- gpr_atm RefMutate(gpr_atm delta,
374
- int barrier GRPC_SUBCHANNEL_REF_MUTATE_EXTRA_ARGS);
342
+ void MaybeStartConnectingLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
343
+ static void OnRetryAlarm(void* arg, grpc_error* error)
344
+ ABSL_LOCKS_EXCLUDED(mu_);
345
+ void ContinueConnectingLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
346
+ static void OnConnectingFinished(void* arg, grpc_error* error)
347
+ ABSL_LOCKS_EXCLUDED(mu_);
348
+ bool PublishTransportLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
375
349
 
376
350
  // The subchannel pool this subchannel is in.
377
351
  RefCountedPtr<SubchannelPoolInterface> subchannel_pool_;
378
352
  // TODO(juanlishen): Consider using args_ as key_ directly.
379
353
  // Subchannel key that identifies this subchannel in the subchannel pool.
380
- SubchannelKey* key_;
354
+ const SubchannelKey key_;
381
355
  // Channel args.
382
356
  grpc_channel_args* args_;
383
357
  // pollset_set tracking who's interested in a connection being setup.
384
358
  grpc_pollset_set* pollset_set_;
385
- // Protects the other members.
386
- Mutex mu_;
387
- // Refcount
388
- // - lower INTERNAL_REF_BITS bits are for internal references:
389
- // these do not keep the subchannel open.
390
- // - upper remaining bits are for public references: these do
391
- // keep the subchannel open
392
- gpr_atm ref_pair_;
393
-
394
- // Connection states.
359
+ // Channelz tracking.
360
+ RefCountedPtr<channelz::SubchannelNode> channelz_node_;
361
+
362
+ // Connection state.
395
363
  OrphanablePtr<SubchannelConnector> connector_;
396
- // Set during connection.
397
364
  SubchannelConnector::Result connecting_result_;
398
365
  grpc_closure on_connecting_finished_;
366
+
367
+ // Protects the other members.
368
+ Mutex mu_;
369
+
399
370
  // Active connection, or null.
400
- RefCountedPtr<ConnectedSubchannel> connected_subchannel_;
401
- bool connecting_ = false;
402
- bool disconnected_ = false;
371
+ RefCountedPtr<ConnectedSubchannel> connected_subchannel_ ABSL_GUARDED_BY(mu_);
372
+ bool connecting_ ABSL_GUARDED_BY(mu_) = false;
373
+ bool disconnected_ ABSL_GUARDED_BY(mu_) = false;
403
374
 
404
375
  // Connectivity state tracking.
405
- grpc_connectivity_state state_ = GRPC_CHANNEL_IDLE;
406
- absl::Status status_;
376
+ grpc_connectivity_state state_ ABSL_GUARDED_BY(mu_) = GRPC_CHANNEL_IDLE;
377
+ absl::Status status_ ABSL_GUARDED_BY(mu_);
407
378
  // The list of watchers without a health check service name.
408
- ConnectivityStateWatcherList watcher_list_;
379
+ ConnectivityStateWatcherList watcher_list_ ABSL_GUARDED_BY(mu_);
409
380
  // The map of watchers with health check service names.
410
- HealthWatcherMap health_watcher_map_;
381
+ HealthWatcherMap health_watcher_map_ ABSL_GUARDED_BY(mu_);
411
382
 
412
383
  // Backoff state.
413
- BackOff backoff_;
414
- grpc_millis next_attempt_deadline_;
415
- grpc_millis min_connect_timeout_ms_;
416
- bool backoff_begun_ = false;
384
+ BackOff backoff_ ABSL_GUARDED_BY(mu_);
385
+ grpc_millis next_attempt_deadline_ ABSL_GUARDED_BY(mu_);
386
+ grpc_millis min_connect_timeout_ms_ ABSL_GUARDED_BY(mu_);
387
+ bool backoff_begun_ ABSL_GUARDED_BY(mu_) = false;
417
388
 
418
389
  // Retry alarm.
419
- grpc_timer retry_alarm_;
420
- grpc_closure on_retry_alarm_;
421
- bool have_retry_alarm_ = false;
390
+ grpc_timer retry_alarm_ ABSL_GUARDED_BY(mu_);
391
+ grpc_closure on_retry_alarm_ ABSL_GUARDED_BY(mu_);
392
+ bool have_retry_alarm_ ABSL_GUARDED_BY(mu_) = false;
422
393
  // reset_backoff() was called while alarm was pending.
423
- bool retry_immediately_ = false;
394
+ bool retry_immediately_ ABSL_GUARDED_BY(mu_) = false;
424
395
  // Keepalive time period (-1 for unset)
425
- int keepalive_time_ = -1;
426
-
427
- // Channelz tracking.
428
- RefCountedPtr<channelz::SubchannelNode> channelz_node_;
396
+ int keepalive_time_ ABSL_GUARDED_BY(mu_) = -1;
429
397
  };
430
398
 
431
399
  } // namespace grpc_core
@@ -44,13 +44,27 @@ SubchannelKey::SubchannelKey(const SubchannelKey& other) {
44
44
  }
45
45
 
46
46
  SubchannelKey& SubchannelKey::operator=(const SubchannelKey& other) {
47
+ if (&other == this) {
48
+ return *this;
49
+ }
47
50
  grpc_channel_args_destroy(const_cast<grpc_channel_args*>(args_));
48
51
  Init(other.args_, grpc_channel_args_copy);
49
52
  return *this;
50
53
  }
51
54
 
52
- int SubchannelKey::Cmp(const SubchannelKey& other) const {
53
- return grpc_channel_args_compare(args_, other.args_);
55
+ SubchannelKey::SubchannelKey(SubchannelKey&& other) noexcept {
56
+ args_ = other.args_;
57
+ other.args_ = nullptr;
58
+ }
59
+
60
+ SubchannelKey& SubchannelKey::operator=(SubchannelKey&& other) noexcept {
61
+ args_ = other.args_;
62
+ other.args_ = nullptr;
63
+ return *this;
64
+ }
65
+
66
+ bool SubchannelKey::operator<(const SubchannelKey& other) const {
67
+ return grpc_channel_args_compare(args_, other.args_) < 0;
54
68
  }
55
69
 
56
70
  void SubchannelKey::Init(
@@ -41,11 +41,11 @@ class SubchannelKey {
41
41
  // Copyable.
42
42
  SubchannelKey(const SubchannelKey& other);
43
43
  SubchannelKey& operator=(const SubchannelKey& other);
44
- // Not movable.
45
- SubchannelKey(SubchannelKey&&) = delete;
46
- SubchannelKey& operator=(SubchannelKey&&) = delete;
44
+ // Movable
45
+ SubchannelKey(SubchannelKey&&) noexcept;
46
+ SubchannelKey& operator=(SubchannelKey&&) noexcept;
47
47
 
48
- int Cmp(const SubchannelKey& other) const;
48
+ bool operator<(const SubchannelKey& other) const;
49
49
 
50
50
  private:
51
51
  // Initializes the subchannel key with the given \a args and the function to
@@ -72,15 +72,17 @@ class SubchannelPoolInterface : public RefCounted<SubchannelPoolInterface> {
72
72
  // Registers a subchannel against a key. Returns the subchannel registered
73
73
  // with \a key, which may be different from \a constructed because we reuse
74
74
  // (instead of update) any existing subchannel already registered with \a key.
75
- virtual Subchannel* RegisterSubchannel(SubchannelKey* key,
76
- Subchannel* constructed) = 0;
75
+ virtual RefCountedPtr<Subchannel> RegisterSubchannel(
76
+ const SubchannelKey& key, RefCountedPtr<Subchannel> constructed) = 0;
77
77
 
78
78
  // Removes the registered subchannel found by \a key.
79
- virtual void UnregisterSubchannel(SubchannelKey* key) = 0;
79
+ virtual void UnregisterSubchannel(const SubchannelKey& key,
80
+ Subchannel* subchannel) = 0;
80
81
 
81
82
  // Finds the subchannel registered for the given subchannel key. Returns NULL
82
83
  // if no such channel exists. Thread-safe.
83
- virtual Subchannel* FindSubchannel(SubchannelKey* key) = 0;
84
+ virtual RefCountedPtr<Subchannel> FindSubchannel(
85
+ const SubchannelKey& key) = 0;
84
86
 
85
87
  // Creates a channel arg from \a subchannel pool.
86
88
  static grpc_arg CreateChannelArg(SubchannelPoolInterface* subchannel_pool);
@@ -187,7 +187,7 @@ void ChannelData::StartTransportOp(grpc_channel_element* elem,
187
187
  ChannelData* chand = static_cast<ChannelData*>(elem->channel_data);
188
188
  // Catch the disconnect_with_error transport op.
189
189
  if (op->disconnect_with_error != nullptr) {
190
- // IncreaseCallCount() introduces a dummy call and prevent the timer from
190
+ // IncreaseCallCount() introduces a phony call and prevent the timer from
191
191
  // being reset by other threads.
192
192
  chand->IncreaseCallCount();
193
193
  // If the timer has been set, cancel the timer.
@@ -0,0 +1,500 @@
1
+ //
2
+ // Copyright 2021 gRPC authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
16
+
17
+ #include <grpc/support/port_platform.h>
18
+
19
+ #include "src/core/ext/filters/fault_injection/fault_injection_filter.h"
20
+
21
+ #include "absl/strings/numbers.h"
22
+
23
+ #include <grpc/support/alloc.h>
24
+ #include <grpc/support/log.h>
25
+
26
+ #include "src/core/ext/filters/client_channel/service_config.h"
27
+ #include "src/core/ext/filters/client_channel/service_config_call_data.h"
28
+ #include "src/core/ext/filters/fault_injection/service_config_parser.h"
29
+ #include "src/core/lib/channel/channel_stack.h"
30
+ #include "src/core/lib/channel/status_util.h"
31
+ #include "src/core/lib/gprpp/atomic.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"
35
+ #include "src/core/lib/transport/status_conversion.h"
36
+
37
+ namespace grpc_core {
38
+
39
+ TraceFlag grpc_fault_injection_filter_trace(false, "fault_injection_filter");
40
+
41
+ namespace {
42
+
43
+ Atomic<uint32_t> g_active_faults{0};
44
+ static_assert(
45
+ std::is_trivially_destructible<Atomic<uint32_t>>::value,
46
+ "the active fault counter needs to have a trivially destructible type");
47
+
48
+ inline int GetLinkedMetadatumValueInt(grpc_linked_mdelem* md) {
49
+ int res;
50
+ if (absl::SimpleAtoi(StringViewFromSlice(GRPC_MDVALUE(md->md)), &res)) {
51
+ return res;
52
+ } else {
53
+ return -1;
54
+ }
55
+ }
56
+
57
+ inline uint32_t GetLinkedMetadatumValueUnsignedInt(grpc_linked_mdelem* md) {
58
+ uint32_t res;
59
+ if (absl::SimpleAtoi(StringViewFromSlice(GRPC_MDVALUE(md->md)), &res)) {
60
+ return res;
61
+ } else {
62
+ return -1;
63
+ }
64
+ }
65
+
66
+ inline int64_t GetLinkedMetadatumValueInt64(grpc_linked_mdelem* md) {
67
+ int64_t res;
68
+ if (absl::SimpleAtoi(StringViewFromSlice(GRPC_MDVALUE(md->md)), &res)) {
69
+ return res;
70
+ } else {
71
+ return -1;
72
+ }
73
+ }
74
+
75
+ inline bool UnderFraction(const uint32_t numerator,
76
+ const uint32_t denominator) {
77
+ if (numerator <= 0) return false;
78
+ if (numerator >= denominator) return true;
79
+ // Generate a random number in [0, denominator).
80
+ const uint32_t random_number = rand() % denominator;
81
+ return random_number < numerator;
82
+ }
83
+
84
+ class ChannelData {
85
+ public:
86
+ static grpc_error* Init(grpc_channel_element* elem,
87
+ grpc_channel_element_args* args);
88
+ static void Destroy(grpc_channel_element* elem);
89
+
90
+ int index() const { return index_; }
91
+
92
+ private:
93
+ ChannelData(grpc_channel_element* elem, grpc_channel_element_args* args);
94
+ ~ChannelData() = default;
95
+
96
+ // The relative index of instances of the same filter.
97
+ int index_;
98
+ };
99
+
100
+ class CallData {
101
+ public:
102
+ static grpc_error* Init(grpc_call_element* elem,
103
+ const grpc_call_element_args* args);
104
+
105
+ static void Destroy(grpc_call_element* elem,
106
+ const grpc_call_final_info* /*final_info*/,
107
+ grpc_closure* /*then_schedule_closure*/);
108
+
109
+ static void StartTransportStreamOpBatch(
110
+ grpc_call_element* elem, grpc_transport_stream_op_batch* batch);
111
+
112
+ private:
113
+ class ResumeBatchCanceller;
114
+
115
+ CallData(grpc_call_element* elem, const grpc_call_element_args* args);
116
+ ~CallData();
117
+
118
+ void DecideWhetherToInjectFaults(grpc_metadata_batch* initial_metadata);
119
+
120
+ // Checks if current active faults exceed the allowed max faults.
121
+ bool HaveActiveFaultsQuota(bool increment);
122
+
123
+ // Returns true if this RPC needs to be delayed. If so, this call will be
124
+ // counted as an active fault.
125
+ bool MaybeDelay();
126
+
127
+ // Returns the aborted RPC status if this RPC needs to be aborted. If so,
128
+ // this call will be counted as an active fault. Otherwise, it returns
129
+ // GRPC_ERROR_NONE.
130
+ // If this call is already been delay injected, skip the active faults
131
+ // quota check.
132
+ grpc_error* MaybeAbort();
133
+
134
+ // Delays the stream operations batch.
135
+ void DelayBatch(grpc_call_element* elem,
136
+ grpc_transport_stream_op_batch* batch);
137
+
138
+ // Cancels the delay timer.
139
+ void CancelDelayTimer() { grpc_timer_cancel(&delay_timer_); }
140
+
141
+ // Finishes the fault injection, should only be called once.
142
+ void FaultInjectionFinished() {
143
+ g_active_faults.FetchSub(1, MemoryOrder::RELAXED);
144
+ }
145
+
146
+ // This is a callback that will be invoked after the delay timer is up.
147
+ static void ResumeBatch(void* arg, grpc_error* error);
148
+
149
+ // This is a callback invoked upon completion of recv_trailing_metadata.
150
+ // Injects the abort_error_ to the recv_trailing_metadata batch if needed.
151
+ static void HijackedRecvTrailingMetadataReady(void* arg, grpc_error*);
152
+
153
+ // Used to track the policy structs that needs to be destroyed in dtor.
154
+ bool fi_policy_owned_ = false;
155
+ const FaultInjectionMethodParsedConfig::FaultInjectionPolicy* fi_policy_;
156
+ grpc_call_stack* owning_call_;
157
+ Arena* arena_;
158
+ CallCombiner* call_combiner_;
159
+
160
+ // Indicates whether we are doing a delay and/or an abort for this call.
161
+ bool delay_request_ = false;
162
+ bool abort_request_ = false;
163
+
164
+ // Delay states
165
+ grpc_timer delay_timer_ ABSL_GUARDED_BY(delay_mu_);
166
+ ResumeBatchCanceller* resume_batch_canceller_ ABSL_GUARDED_BY(delay_mu_);
167
+ grpc_transport_stream_op_batch* delayed_batch_ ABSL_GUARDED_BY(delay_mu_);
168
+ // Abort states
169
+ grpc_error* abort_error_ = GRPC_ERROR_NONE;
170
+ grpc_closure recv_trailing_metadata_ready_;
171
+ grpc_closure* original_recv_trailing_metadata_ready_;
172
+ // Protects the asynchronous delay, resume, and cancellation.
173
+ Mutex delay_mu_;
174
+ };
175
+
176
+ // ChannelData
177
+
178
+ grpc_error* ChannelData::Init(grpc_channel_element* elem,
179
+ grpc_channel_element_args* args) {
180
+ GPR_ASSERT(elem->filter == &FaultInjectionFilterVtable);
181
+ new (elem->channel_data) ChannelData(elem, args);
182
+ return GRPC_ERROR_NONE;
183
+ }
184
+
185
+ void ChannelData::Destroy(grpc_channel_element* elem) {
186
+ auto* chand = static_cast<ChannelData*>(elem->channel_data);
187
+ chand->~ChannelData();
188
+ }
189
+
190
+ ChannelData::ChannelData(grpc_channel_element* elem,
191
+ grpc_channel_element_args* args)
192
+ : index_(grpc_channel_stack_filter_instance_number(args->channel_stack,
193
+ elem)) {}
194
+
195
+ // CallData::ResumeBatchCanceller
196
+
197
+ class CallData::ResumeBatchCanceller {
198
+ public:
199
+ explicit ResumeBatchCanceller(grpc_call_element* elem) : elem_(elem) {
200
+ auto* calld = static_cast<CallData*>(elem->call_data);
201
+ GRPC_CALL_STACK_REF(calld->owning_call_, "ResumeBatchCanceller");
202
+ GRPC_CLOSURE_INIT(&closure_, &Cancel, this, grpc_schedule_on_exec_ctx);
203
+ calld->call_combiner_->SetNotifyOnCancel(&closure_);
204
+ }
205
+
206
+ private:
207
+ static void Cancel(void* arg, grpc_error* error) {
208
+ auto* self = static_cast<ResumeBatchCanceller*>(arg);
209
+ auto* chand = static_cast<ChannelData*>(self->elem_->channel_data);
210
+ auto* calld = static_cast<CallData*>(self->elem_->call_data);
211
+ {
212
+ MutexLock lock(&calld->delay_mu_);
213
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_fault_injection_filter_trace)) {
214
+ gpr_log(GPR_INFO,
215
+ "chand=%p calld=%p: cancelling schdueled pick: "
216
+ "error=%s self=%p calld->resume_batch_canceller_=%p",
217
+ chand, calld, grpc_error_string(error), self,
218
+ calld->resume_batch_canceller_);
219
+ }
220
+ if (error != GRPC_ERROR_NONE && calld->resume_batch_canceller_ == self) {
221
+ // Cancel the delayed pick.
222
+ calld->CancelDelayTimer();
223
+ calld->FaultInjectionFinished();
224
+ // Fail pending batches on the call.
225
+ grpc_transport_stream_op_batch_finish_with_failure(
226
+ calld->delayed_batch_, GRPC_ERROR_REF(error),
227
+ calld->call_combiner_);
228
+ }
229
+ }
230
+ GRPC_CALL_STACK_UNREF(calld->owning_call_, "ResumeBatchCanceller");
231
+ delete self;
232
+ }
233
+
234
+ grpc_call_element* elem_;
235
+ grpc_closure closure_;
236
+ };
237
+
238
+ // CallData
239
+
240
+ grpc_error* CallData::Init(grpc_call_element* elem,
241
+ const grpc_call_element_args* args) {
242
+ auto* calld = new (elem->call_data) CallData(elem, args);
243
+ if (calld->fi_policy_ == nullptr) {
244
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
245
+ "failed to find fault injection policy");
246
+ }
247
+ return GRPC_ERROR_NONE;
248
+ }
249
+
250
+ void CallData::Destroy(grpc_call_element* elem,
251
+ const grpc_call_final_info* /*final_info*/,
252
+ grpc_closure* /*then_schedule_closure*/) {
253
+ auto* calld = static_cast<CallData*>(elem->call_data);
254
+ calld->~CallData();
255
+ }
256
+
257
+ void CallData::StartTransportStreamOpBatch(
258
+ grpc_call_element* elem, grpc_transport_stream_op_batch* batch) {
259
+ auto* calld = static_cast<CallData*>(elem->call_data);
260
+ // There should only be one send_initial_metdata op, and fault injection also
261
+ // only need to be enforced once.
262
+ if (batch->send_initial_metadata) {
263
+ calld->DecideWhetherToInjectFaults(
264
+ batch->payload->send_initial_metadata.send_initial_metadata);
265
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_fault_injection_filter_trace)) {
266
+ gpr_log(GPR_INFO,
267
+ "chand=%p calld=%p: Fault injection triggered delay=%d abort=%d",
268
+ elem->channel_data, calld, calld->delay_request_,
269
+ calld->abort_request_);
270
+ }
271
+ if (calld->MaybeDelay()) {
272
+ // Delay the batch, and pass down the batch in the scheduled closure.
273
+ calld->DelayBatch(elem, batch);
274
+ return;
275
+ }
276
+ grpc_error* abort_error = calld->MaybeAbort();
277
+ if (abort_error != GRPC_ERROR_NONE) {
278
+ calld->abort_error_ = abort_error;
279
+ grpc_transport_stream_op_batch_finish_with_failure(
280
+ batch, GRPC_ERROR_REF(calld->abort_error_), calld->call_combiner_);
281
+ return;
282
+ }
283
+ } else {
284
+ if (batch->recv_trailing_metadata) {
285
+ // Intercept recv_trailing_metadata callback so that we can inject the
286
+ // failure when aborting streaming calls, because their
287
+ // recv_trailing_metatdata op may not be on the same batch as the
288
+ // send_initial_metadata op.
289
+ calld->original_recv_trailing_metadata_ready_ =
290
+ batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready;
291
+ batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready =
292
+ &calld->recv_trailing_metadata_ready_;
293
+ }
294
+ if (calld->abort_error_ != GRPC_ERROR_NONE) {
295
+ // If we already decided to abort, then immediately fail this batch.
296
+ grpc_transport_stream_op_batch_finish_with_failure(
297
+ batch, GRPC_ERROR_REF(calld->abort_error_), calld->call_combiner_);
298
+ return;
299
+ }
300
+ }
301
+ // Chain to the next filter.
302
+ grpc_call_next_op(elem, batch);
303
+ }
304
+
305
+ CallData::CallData(grpc_call_element* elem, const grpc_call_element_args* args)
306
+ : owning_call_(args->call_stack),
307
+ arena_(args->arena),
308
+ call_combiner_(args->call_combiner) {
309
+ auto* chand = static_cast<ChannelData*>(elem->channel_data);
310
+ // Fetch the fault injection policy from the service config, based on the
311
+ // relative index for which policy should this CallData use.
312
+ auto* service_config_call_data = static_cast<ServiceConfigCallData*>(
313
+ args->context[GRPC_CONTEXT_SERVICE_CONFIG_CALL_DATA].value);
314
+ auto* method_params = static_cast<FaultInjectionMethodParsedConfig*>(
315
+ service_config_call_data->GetMethodParsedConfig(
316
+ FaultInjectionServiceConfigParser::ParserIndex()));
317
+ if (method_params != nullptr) {
318
+ fi_policy_ = method_params->fault_injection_policy(chand->index());
319
+ }
320
+ GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready_,
321
+ HijackedRecvTrailingMetadataReady, elem,
322
+ grpc_schedule_on_exec_ctx);
323
+ }
324
+
325
+ CallData::~CallData() {
326
+ if (fi_policy_owned_) {
327
+ fi_policy_->~FaultInjectionPolicy();
328
+ }
329
+ GRPC_ERROR_UNREF(abort_error_);
330
+ }
331
+
332
+ void CallData::DecideWhetherToInjectFaults(
333
+ grpc_metadata_batch* initial_metadata) {
334
+ FaultInjectionMethodParsedConfig::FaultInjectionPolicy* copied_policy =
335
+ nullptr;
336
+ // Update the policy with values in initial metadata.
337
+ if (!fi_policy_->abort_code_header.empty() ||
338
+ !fi_policy_->abort_percentage_header.empty() ||
339
+ !fi_policy_->delay_header.empty() ||
340
+ !fi_policy_->delay_percentage_header.empty()) {
341
+ // Defer the actual copy until the first matched header.
342
+ auto maybe_copy_policy_func = [this, &copied_policy]() {
343
+ if (copied_policy == nullptr) {
344
+ copied_policy =
345
+ arena_->New<FaultInjectionMethodParsedConfig::FaultInjectionPolicy>(
346
+ *fi_policy_);
347
+ }
348
+ };
349
+ for (grpc_linked_mdelem* md = initial_metadata->list.head; md != nullptr;
350
+ md = md->next) {
351
+ absl::string_view key = StringViewFromSlice(GRPC_MDKEY(md->md));
352
+ // Only perform string comparison if:
353
+ // 1. Needs to check this header;
354
+ // 2. The value is not been filled before.
355
+ if (!fi_policy_->abort_code_header.empty() &&
356
+ (copied_policy == nullptr ||
357
+ copied_policy->abort_code == GRPC_STATUS_OK) &&
358
+ key == fi_policy_->abort_code_header) {
359
+ maybe_copy_policy_func();
360
+ grpc_status_code_from_int(GetLinkedMetadatumValueInt(md),
361
+ &copied_policy->abort_code);
362
+ }
363
+ if (!fi_policy_->abort_percentage_header.empty() &&
364
+ key == fi_policy_->abort_percentage_header) {
365
+ maybe_copy_policy_func();
366
+ copied_policy->abort_percentage_numerator =
367
+ GPR_MIN(GetLinkedMetadatumValueUnsignedInt(md),
368
+ fi_policy_->abort_percentage_numerator);
369
+ }
370
+ if (!fi_policy_->delay_header.empty() &&
371
+ (copied_policy == nullptr || copied_policy->delay == 0) &&
372
+ key == fi_policy_->delay_header) {
373
+ maybe_copy_policy_func();
374
+ copied_policy->delay = static_cast<grpc_millis>(
375
+ GPR_MAX(GetLinkedMetadatumValueInt64(md), 0));
376
+ }
377
+ if (!fi_policy_->delay_percentage_header.empty() &&
378
+ key == fi_policy_->delay_percentage_header) {
379
+ maybe_copy_policy_func();
380
+ copied_policy->delay_percentage_numerator =
381
+ GPR_MIN(GetLinkedMetadatumValueUnsignedInt(md),
382
+ fi_policy_->delay_percentage_numerator);
383
+ }
384
+ }
385
+ if (copied_policy != nullptr) fi_policy_ = copied_policy;
386
+ }
387
+ // Roll the dice
388
+ delay_request_ = fi_policy_->delay != 0 &&
389
+ UnderFraction(fi_policy_->delay_percentage_numerator,
390
+ fi_policy_->delay_percentage_denominator);
391
+ abort_request_ = fi_policy_->abort_code != GRPC_STATUS_OK &&
392
+ UnderFraction(fi_policy_->abort_percentage_numerator,
393
+ fi_policy_->abort_percentage_denominator);
394
+ if (!delay_request_ && !abort_request_) {
395
+ if (copied_policy != nullptr) copied_policy->~FaultInjectionPolicy();
396
+ // No fault injection for this call
397
+ } else {
398
+ fi_policy_owned_ = copied_policy != nullptr;
399
+ }
400
+ }
401
+
402
+ bool CallData::HaveActiveFaultsQuota(bool increment) {
403
+ if (g_active_faults.Load(MemoryOrder::ACQUIRE) >= fi_policy_->max_faults) {
404
+ return false;
405
+ }
406
+ if (increment) g_active_faults.FetchAdd(1, MemoryOrder::RELAXED);
407
+ return true;
408
+ }
409
+
410
+ bool CallData::MaybeDelay() {
411
+ if (delay_request_) {
412
+ return HaveActiveFaultsQuota(true);
413
+ }
414
+ return false;
415
+ }
416
+
417
+ grpc_error* CallData::MaybeAbort() {
418
+ if (abort_request_ && (delay_request_ || HaveActiveFaultsQuota(false))) {
419
+ return grpc_error_set_int(
420
+ GRPC_ERROR_CREATE_FROM_COPIED_STRING(fi_policy_->abort_message.c_str()),
421
+ GRPC_ERROR_INT_GRPC_STATUS, fi_policy_->abort_code);
422
+ }
423
+ return GRPC_ERROR_NONE;
424
+ }
425
+
426
+ void CallData::DelayBatch(grpc_call_element* elem,
427
+ grpc_transport_stream_op_batch* batch) {
428
+ MutexLock lock(&delay_mu_);
429
+ delayed_batch_ = batch;
430
+ resume_batch_canceller_ = new ResumeBatchCanceller(elem);
431
+ grpc_millis resume_time = ExecCtx::Get()->Now() + fi_policy_->delay;
432
+ GRPC_CLOSURE_INIT(&batch->handler_private.closure, ResumeBatch, elem,
433
+ grpc_schedule_on_exec_ctx);
434
+ grpc_timer_init(&delay_timer_, resume_time, &batch->handler_private.closure);
435
+ }
436
+
437
+ void CallData::ResumeBatch(void* arg, grpc_error* error) {
438
+ grpc_call_element* elem = static_cast<grpc_call_element*>(arg);
439
+ auto* calld = static_cast<CallData*>(elem->call_data);
440
+ MutexLock lock(&calld->delay_mu_);
441
+ // Cancelled or canceller has already run
442
+ if (error == GRPC_ERROR_CANCELLED ||
443
+ calld->resume_batch_canceller_ == nullptr) {
444
+ return;
445
+ }
446
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_fault_injection_filter_trace)) {
447
+ gpr_log(GPR_INFO, "chand=%p calld=%p: Resuming delayed stream op batch %p",
448
+ elem->channel_data, calld, calld->delayed_batch_);
449
+ }
450
+ // Lame the canceller
451
+ calld->resume_batch_canceller_ = nullptr;
452
+ // Finish fault injection.
453
+ calld->FaultInjectionFinished();
454
+ // Abort if needed.
455
+ error = calld->MaybeAbort();
456
+ if (error != GRPC_ERROR_NONE) {
457
+ grpc_transport_stream_op_batch_finish_with_failure(
458
+ calld->delayed_batch_, error, calld->call_combiner_);
459
+ return;
460
+ }
461
+ // Chain to the next filter.
462
+ grpc_call_next_op(elem, calld->delayed_batch_);
463
+ }
464
+
465
+ void CallData::HijackedRecvTrailingMetadataReady(void* arg, grpc_error* error) {
466
+ grpc_call_element* elem = static_cast<grpc_call_element*>(arg);
467
+ auto* calld = static_cast<CallData*>(elem->call_data);
468
+ if (calld->abort_error_ != GRPC_ERROR_NONE) {
469
+ error = grpc_error_add_child(GRPC_ERROR_REF(error),
470
+ GRPC_ERROR_REF(calld->abort_error_));
471
+ } else {
472
+ error = GRPC_ERROR_REF(error);
473
+ }
474
+ Closure::Run(DEBUG_LOCATION, calld->original_recv_trailing_metadata_ready_,
475
+ error);
476
+ }
477
+
478
+ } // namespace
479
+
480
+ extern const grpc_channel_filter FaultInjectionFilterVtable = {
481
+ CallData::StartTransportStreamOpBatch,
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
+ };
493
+
494
+ void FaultInjectionFilterInit(void) {
495
+ grpc_core::FaultInjectionServiceConfigParser::Register();
496
+ }
497
+
498
+ void FaultInjectionFilterShutdown(void) {}
499
+
500
+ } // namespace grpc_core