grpc 1.21.0 → 1.32.0

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 (1843) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +2516 -19950
  3. data/etc/roots.pem +44 -100
  4. data/include/grpc/grpc.h +3 -1
  5. data/include/grpc/grpc_security.h +238 -55
  6. data/include/grpc/grpc_security_constants.h +32 -1
  7. data/include/grpc/impl/codegen/README.md +22 -0
  8. data/include/grpc/impl/codegen/gpr_types.h +1 -1
  9. data/include/grpc/impl/codegen/grpc_types.h +61 -13
  10. data/include/grpc/impl/codegen/port_platform.h +74 -30
  11. data/include/grpc/impl/codegen/sync.h +5 -3
  12. data/include/grpc/impl/codegen/sync_abseil.h +36 -0
  13. data/include/grpc/impl/codegen/sync_generic.h +1 -1
  14. data/include/grpc/module.modulemap +25 -37
  15. data/include/grpc/slice.h +2 -2
  16. data/include/grpc/support/alloc.h +0 -16
  17. data/include/grpc/support/sync_abseil.h +26 -0
  18. data/src/core/ext/filters/client_channel/backend_metric.cc +84 -0
  19. data/src/core/ext/filters/client_channel/backend_metric.h +36 -0
  20. data/src/core/ext/filters/client_channel/backup_poller.cc +10 -8
  21. data/src/core/ext/filters/client_channel/backup_poller.h +5 -2
  22. data/src/core/ext/filters/client_channel/channel_connectivity.cc +18 -4
  23. data/src/core/ext/filters/client_channel/client_channel.cc +1516 -742
  24. data/src/core/ext/filters/client_channel/client_channel.h +25 -9
  25. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +50 -139
  26. data/src/core/ext/filters/client_channel/client_channel_channelz.h +15 -39
  27. data/src/core/ext/filters/client_channel/client_channel_factory.cc +1 -1
  28. data/src/core/ext/filters/client_channel/client_channel_factory.h +1 -9
  29. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +8 -13
  30. data/src/core/ext/filters/client_channel/config_selector.cc +62 -0
  31. data/src/core/ext/filters/client_channel/config_selector.h +93 -0
  32. data/src/core/ext/filters/client_channel/connector.h +42 -39
  33. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +34 -12
  34. data/src/core/ext/filters/client_channel/health/health_check_client.cc +75 -115
  35. data/src/core/ext/filters/client_channel/health/health_check_client.h +8 -16
  36. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +75 -46
  37. data/src/core/ext/filters/client_channel/http_proxy.cc +126 -120
  38. data/src/core/ext/filters/client_channel/http_proxy.h +5 -1
  39. data/src/core/ext/filters/client_channel/lb_policy.cc +35 -35
  40. data/src/core/ext/filters/client_channel/lb_policy.h +225 -152
  41. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +83 -0
  42. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +99 -0
  43. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +299 -0
  44. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +83 -0
  45. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +41 -25
  46. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +635 -734
  47. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +7 -0
  48. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +76 -0
  49. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +37 -0
  50. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +9 -2
  51. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +33 -49
  52. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +4 -3
  53. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +7 -6
  54. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +157 -271
  55. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +42 -58
  56. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +113 -166
  57. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +890 -0
  58. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +61 -101
  59. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +116 -260
  60. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +744 -0
  61. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +423 -0
  62. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +946 -0
  63. data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +537 -0
  64. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +3 -7
  65. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +1141 -0
  66. data/src/core/ext/filters/client_channel/lb_policy_factory.h +6 -9
  67. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +53 -77
  68. data/src/core/ext/filters/client_channel/lb_policy_registry.h +3 -3
  69. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +8 -8
  70. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +2 -1
  71. data/src/core/ext/filters/client_channel/proxy_mapper.h +14 -34
  72. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +46 -79
  73. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +23 -17
  74. data/src/core/ext/filters/client_channel/resolver.cc +6 -9
  75. data/src/core/ext/filters/client_channel/resolver.h +19 -37
  76. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +156 -130
  77. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +74 -39
  78. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +15 -21
  79. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +33 -33
  80. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +16 -13
  81. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +476 -129
  82. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +231 -193
  83. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +6 -4
  84. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +9 -6
  85. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +1 -2
  86. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -2
  87. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +73 -48
  88. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +165 -116
  89. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +8 -7
  90. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +45 -29
  91. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +536 -0
  92. data/src/core/ext/filters/client_channel/resolver_factory.h +11 -11
  93. data/src/core/ext/filters/client_channel/resolver_registry.cc +39 -24
  94. data/src/core/ext/filters/client_channel/resolver_registry.h +17 -12
  95. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +251 -313
  96. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +28 -26
  97. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +100 -325
  98. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +48 -53
  99. data/src/core/ext/filters/client_channel/retry_throttle.cc +5 -5
  100. data/src/core/ext/filters/client_channel/retry_throttle.h +2 -6
  101. data/src/core/ext/filters/client_channel/server_address.cc +40 -14
  102. data/src/core/ext/filters/client_channel/server_address.h +45 -15
  103. data/src/core/ext/filters/client_channel/service_config.cc +143 -253
  104. data/src/core/ext/filters/client_channel/service_config.h +47 -131
  105. data/src/core/ext/filters/client_channel/service_config_call_data.h +68 -0
  106. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +142 -0
  107. data/src/core/ext/filters/client_channel/service_config_parser.cc +87 -0
  108. data/src/core/ext/filters/client_channel/service_config_parser.h +89 -0
  109. data/src/core/ext/filters/client_channel/subchannel.cc +436 -288
  110. data/src/core/ext/filters/client_channel/subchannel.h +181 -53
  111. data/src/core/ext/filters/client_channel/subchannel_interface.h +94 -0
  112. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +3 -6
  113. data/src/core/ext/filters/client_idle/client_idle_filter.cc +440 -0
  114. data/src/core/ext/filters/deadline/deadline_filter.cc +30 -28
  115. data/src/core/ext/filters/http/client/http_client_filter.cc +66 -70
  116. data/src/core/ext/filters/http/client_authority_filter.cc +21 -21
  117. data/src/core/ext/filters/http/http_filters_plugin.cc +28 -12
  118. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +335 -301
  119. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +399 -0
  120. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +31 -0
  121. data/src/core/ext/filters/http/server/http_server_filter.cc +66 -39
  122. data/src/core/ext/filters/max_age/max_age_filter.cc +72 -60
  123. data/src/core/ext/filters/message_size/message_size_filter.cc +116 -144
  124. data/src/core/ext/filters/message_size/message_size_filter.h +12 -6
  125. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +19 -17
  126. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +193 -171
  127. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +48 -1
  128. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +29 -25
  129. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +44 -64
  130. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +384 -305
  131. data/src/core/ext/transport/chttp2/server/chttp2_server.h +7 -2
  132. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +3 -3
  133. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +10 -16
  134. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +9 -9
  135. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +4 -6
  136. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +640 -560
  137. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +2 -0
  138. data/src/core/ext/transport/chttp2/transport/context_list.cc +5 -3
  139. data/src/core/ext/transport/chttp2/transport/flow_control.cc +26 -31
  140. data/src/core/ext/transport/chttp2/transport/flow_control.h +28 -38
  141. data/src/core/ext/transport/chttp2/transport/frame_data.cc +45 -54
  142. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +7 -9
  143. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +2 -3
  144. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +7 -7
  145. data/src/core/ext/transport/chttp2/transport/frame_ping.h +2 -3
  146. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +21 -13
  147. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +9 -3
  148. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +13 -12
  149. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -3
  150. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +9 -12
  151. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +2 -3
  152. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +531 -348
  153. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +26 -15
  154. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +213 -143
  155. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +11 -4
  156. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +41 -196
  157. data/src/core/ext/transport/chttp2/transport/hpack_table.h +62 -18
  158. data/src/core/ext/transport/chttp2/transport/http2_settings.h +4 -5
  159. data/src/core/ext/transport/chttp2/transport/huffsyms.h +2 -3
  160. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +2 -1
  161. data/src/core/ext/transport/chttp2/transport/internal.h +64 -47
  162. data/src/core/ext/transport/chttp2/transport/parsing.cc +148 -162
  163. data/src/core/ext/transport/chttp2/transport/stream_map.cc +28 -18
  164. data/src/core/ext/transport/chttp2/transport/stream_map.h +2 -3
  165. data/src/core/ext/transport/chttp2/transport/writing.cc +38 -30
  166. data/src/core/ext/transport/inproc/inproc_transport.cc +164 -114
  167. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +17 -0
  168. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +29 -0
  169. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +27 -0
  170. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +53 -0
  171. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +224 -0
  172. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +700 -0
  173. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +74 -0
  174. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +226 -0
  175. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +380 -0
  176. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +1378 -0
  177. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +35 -0
  178. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +69 -0
  179. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +55 -0
  180. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +323 -0
  181. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +112 -0
  182. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +334 -0
  183. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +35 -0
  184. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +79 -0
  185. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +309 -0
  186. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +869 -0
  187. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +96 -0
  188. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +328 -0
  189. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +34 -0
  190. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +71 -0
  191. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +195 -0
  192. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +634 -0
  193. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +170 -0
  194. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +684 -0
  195. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +36 -0
  196. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +80 -0
  197. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +152 -0
  198. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +536 -0
  199. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +28 -0
  200. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +58 -0
  201. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +34 -0
  202. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +88 -0
  203. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +91 -0
  204. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +220 -0
  205. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +91 -0
  206. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +273 -0
  207. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +112 -0
  208. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +332 -0
  209. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +33 -0
  210. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +65 -0
  211. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +108 -0
  212. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +401 -0
  213. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +138 -0
  214. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +490 -0
  215. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +41 -0
  216. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +94 -0
  217. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +174 -0
  218. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +599 -0
  219. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +63 -0
  220. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +204 -0
  221. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +773 -0
  222. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +2855 -0
  223. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +59 -0
  224. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +135 -0
  225. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +50 -0
  226. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +108 -0
  227. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +312 -0
  228. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +1125 -0
  229. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +20 -0
  230. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +34 -0
  231. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +111 -0
  232. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +401 -0
  233. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +72 -0
  234. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +198 -0
  235. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +105 -0
  236. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +388 -0
  237. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +27 -0
  238. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +49 -0
  239. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +25 -0
  240. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +49 -0
  241. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +129 -0
  242. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +386 -0
  243. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +30 -0
  244. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +49 -0
  245. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +30 -0
  246. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +49 -0
  247. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +55 -0
  248. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +136 -0
  249. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +29 -0
  250. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +49 -0
  251. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +27 -0
  252. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +49 -0
  253. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +47 -0
  254. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +114 -0
  255. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +35 -0
  256. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +77 -0
  257. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +34 -0
  258. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +71 -0
  259. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +64 -0
  260. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +145 -0
  261. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +53 -0
  262. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +127 -0
  263. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +63 -0
  264. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +188 -0
  265. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +88 -0
  266. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +258 -0
  267. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +90 -0
  268. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +250 -0
  269. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.c +17 -0
  270. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +35 -0
  271. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +40 -0
  272. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +86 -0
  273. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +51 -0
  274. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +111 -0
  275. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +30 -0
  276. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +61 -0
  277. data/src/core/ext/upb-generated/gogoproto/gogo.upb.c +17 -0
  278. data/src/core/ext/upb-generated/gogoproto/gogo.upb.h +29 -0
  279. data/src/core/ext/upb-generated/google/api/annotations.upb.c +18 -0
  280. data/src/core/ext/upb-generated/google/api/annotations.upb.h +29 -0
  281. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +234 -0
  282. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +759 -0
  283. data/src/core/ext/upb-generated/google/api/http.upb.c +66 -0
  284. data/src/core/ext/upb-generated/google/api/http.upb.h +191 -0
  285. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +27 -0
  286. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +57 -0
  287. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +486 -0
  288. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +1722 -0
  289. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +27 -0
  290. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +57 -0
  291. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +22 -0
  292. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +49 -0
  293. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +79 -0
  294. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +194 -0
  295. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +27 -0
  296. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +57 -0
  297. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +106 -0
  298. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +237 -0
  299. data/src/core/ext/upb-generated/google/rpc/status.upb.c +33 -0
  300. data/src/core/ext/upb-generated/google/rpc/status.upb.h +74 -0
  301. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +49 -0
  302. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +113 -0
  303. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +212 -0
  304. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +672 -0
  305. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +42 -0
  306. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +110 -0
  307. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +36 -0
  308. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +83 -0
  309. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +141 -0
  310. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +396 -0
  311. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +48 -0
  312. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +103 -0
  313. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +17 -0
  314. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +29 -0
  315. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +28 -0
  316. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +64 -0
  317. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +27 -0
  318. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +53 -0
  319. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +58 -0
  320. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +117 -0
  321. data/src/core/ext/upb-generated/validate/validate.upb.c +448 -0
  322. data/src/core/ext/upb-generated/validate/validate.upb.h +2074 -0
  323. data/src/core/ext/xds/xds_api.cc +2388 -0
  324. data/src/core/ext/xds/xds_api.h +360 -0
  325. data/src/core/ext/xds/xds_bootstrap.cc +373 -0
  326. data/src/core/ext/xds/xds_bootstrap.h +93 -0
  327. data/src/core/ext/xds/xds_channel.h +46 -0
  328. data/src/core/ext/xds/xds_channel_args.h +26 -0
  329. data/src/core/ext/xds/xds_channel_secure.cc +103 -0
  330. data/src/core/ext/xds/xds_client.cc +2114 -0
  331. data/src/core/ext/xds/xds_client.h +276 -0
  332. data/src/core/ext/xds/xds_client_stats.cc +115 -0
  333. data/src/core/ext/xds/xds_client_stats.h +211 -0
  334. data/src/core/lib/avl/avl.cc +1 -1
  335. data/src/core/lib/channel/channel_args.cc +52 -14
  336. data/src/core/lib/channel/channel_args.h +41 -3
  337. data/src/core/lib/channel/channel_stack.cc +1 -1
  338. data/src/core/lib/channel/channel_stack.h +38 -18
  339. data/src/core/lib/channel/channel_trace.cc +32 -45
  340. data/src/core/lib/channel/channel_trace.h +3 -3
  341. data/src/core/lib/channel/channelz.cc +377 -318
  342. data/src/core/lib/channel/channelz.h +128 -90
  343. data/src/core/lib/channel/channelz_registry.cc +123 -178
  344. data/src/core/lib/channel/channelz_registry.h +14 -32
  345. data/src/core/lib/channel/connected_channel.cc +28 -25
  346. data/src/core/lib/channel/context.h +2 -2
  347. data/src/core/lib/channel/handshaker.cc +18 -14
  348. data/src/core/lib/channel/handshaker.h +7 -6
  349. data/src/core/lib/channel/handshaker_factory.h +1 -3
  350. data/src/core/lib/channel/handshaker_registry.cc +9 -21
  351. data/src/core/lib/channel/handshaker_registry.h +3 -3
  352. data/src/core/lib/channel/status_util.cc +2 -3
  353. data/src/core/lib/compression/compression.cc +16 -11
  354. data/src/core/lib/compression/compression_args.cc +13 -6
  355. data/src/core/lib/compression/compression_args.h +3 -2
  356. data/src/core/lib/compression/compression_internal.cc +15 -11
  357. data/src/core/lib/compression/compression_internal.h +9 -1
  358. data/src/core/lib/compression/message_compress.cc +8 -3
  359. data/src/core/lib/compression/stream_compression.cc +3 -2
  360. data/src/core/lib/compression/stream_compression.h +2 -2
  361. data/src/core/lib/compression/stream_compression_gzip.cc +9 -9
  362. data/src/core/lib/compression/stream_compression_identity.cc +5 -7
  363. data/src/core/lib/debug/stats.cc +21 -27
  364. data/src/core/lib/debug/stats.h +3 -1
  365. data/src/core/lib/debug/trace.h +3 -2
  366. data/src/core/lib/gpr/alloc.cc +4 -29
  367. data/src/core/lib/gpr/cpu_linux.cc +1 -1
  368. data/src/core/lib/gpr/env.h +1 -1
  369. data/src/core/lib/gpr/env_linux.cc +10 -21
  370. data/src/core/lib/gpr/env_posix.cc +0 -5
  371. data/src/core/lib/gpr/log_linux.cc +8 -10
  372. data/src/core/lib/gpr/log_posix.cc +7 -9
  373. data/src/core/lib/gpr/spinlock.h +2 -3
  374. data/src/core/lib/gpr/string.cc +25 -36
  375. data/src/core/lib/gpr/string.h +11 -19
  376. data/src/core/lib/gpr/sync_abseil.cc +116 -0
  377. data/src/core/lib/gpr/sync_posix.cc +10 -142
  378. data/src/core/lib/gpr/sync_windows.cc +4 -2
  379. data/src/core/lib/gpr/time.cc +4 -0
  380. data/src/core/lib/gpr/time_posix.cc +1 -1
  381. data/src/core/lib/gpr/time_precise.cc +123 -36
  382. data/src/core/lib/gpr/time_precise.h +37 -0
  383. data/src/core/lib/gprpp/arena.cc +3 -3
  384. data/src/core/lib/gprpp/arena.h +2 -3
  385. data/src/core/lib/gprpp/atomic.h +10 -6
  386. data/src/core/lib/gprpp/debug_location.h +3 -2
  387. data/src/core/lib/gprpp/fork.cc +19 -26
  388. data/src/core/lib/gprpp/fork.h +18 -3
  389. data/src/core/lib/gprpp/global_config.h +9 -0
  390. data/src/core/lib/gprpp/global_config_custom.h +1 -1
  391. data/src/core/lib/gprpp/global_config_env.cc +15 -13
  392. data/src/core/lib/gprpp/global_config_env.h +2 -2
  393. data/src/core/lib/gprpp/host_port.cc +112 -0
  394. data/src/core/lib/gprpp/host_port.h +56 -0
  395. data/src/core/lib/gprpp/map.h +16 -382
  396. data/src/core/lib/gprpp/memory.h +12 -75
  397. data/src/core/lib/gprpp/mpscq.cc +108 -0
  398. data/src/core/lib/gprpp/mpscq.h +98 -0
  399. data/src/core/lib/gprpp/orphanable.h +9 -14
  400. data/src/core/lib/gprpp/ref_counted.h +97 -44
  401. data/src/core/lib/gprpp/ref_counted_ptr.h +8 -1
  402. data/src/core/lib/gprpp/sync.h +9 -0
  403. data/src/core/lib/gprpp/thd.h +13 -6
  404. data/src/core/lib/gprpp/thd_posix.cc +29 -3
  405. data/src/core/lib/gprpp/thd_windows.cc +12 -4
  406. data/src/core/lib/http/format_request.cc +46 -65
  407. data/src/core/lib/http/httpcli.cc +18 -16
  408. data/src/core/lib/http/httpcli.h +2 -3
  409. data/src/core/lib/http/httpcli_security_connector.cc +27 -21
  410. data/src/core/lib/http/parser.cc +1 -1
  411. data/src/core/lib/http/parser.h +2 -3
  412. data/src/core/lib/iomgr/buffer_list.cc +45 -40
  413. data/src/core/lib/iomgr/buffer_list.h +27 -27
  414. data/src/core/lib/iomgr/call_combiner.cc +12 -12
  415. data/src/core/lib/iomgr/call_combiner.h +10 -8
  416. data/src/core/lib/iomgr/cfstream_handle.cc +11 -3
  417. data/src/core/lib/iomgr/cfstream_handle.h +11 -3
  418. data/src/core/lib/iomgr/closure.h +43 -141
  419. data/src/core/lib/iomgr/combiner.cc +46 -90
  420. data/src/core/lib/iomgr/combiner.h +30 -8
  421. data/src/core/lib/iomgr/dualstack_socket_posix.cc +47 -0
  422. data/src/core/lib/iomgr/endpoint.cc +5 -1
  423. data/src/core/lib/iomgr/endpoint.h +7 -3
  424. data/src/core/lib/iomgr/endpoint_cfstream.cc +41 -19
  425. data/src/core/lib/iomgr/endpoint_pair.h +2 -3
  426. data/src/core/lib/iomgr/endpoint_pair_posix.cc +11 -11
  427. data/src/core/lib/iomgr/error.cc +26 -19
  428. data/src/core/lib/iomgr/error.h +15 -8
  429. data/src/core/lib/iomgr/error_cfstream.cc +9 -8
  430. data/src/core/lib/iomgr/error_internal.h +1 -1
  431. data/src/core/lib/iomgr/ev_apple.cc +356 -0
  432. data/src/core/lib/iomgr/ev_apple.h +43 -0
  433. data/src/core/lib/iomgr/ev_epoll1_linux.cc +48 -47
  434. data/src/core/lib/iomgr/ev_epollex_linux.cc +80 -94
  435. data/src/core/lib/iomgr/ev_poll_posix.cc +42 -26
  436. data/src/core/lib/iomgr/ev_posix.cc +9 -8
  437. data/src/core/lib/iomgr/ev_posix.h +3 -2
  438. data/src/core/lib/iomgr/ev_windows.cc +2 -2
  439. data/src/core/lib/iomgr/exec_ctx.cc +78 -21
  440. data/src/core/lib/iomgr/exec_ctx.h +27 -7
  441. data/src/core/lib/iomgr/executor.cc +25 -41
  442. data/src/core/lib/iomgr/executor.h +7 -7
  443. data/src/core/lib/iomgr/executor/mpmcqueue.cc +183 -0
  444. data/src/core/lib/iomgr/executor/mpmcqueue.h +175 -0
  445. data/src/core/lib/iomgr/executor/threadpool.cc +137 -0
  446. data/src/core/lib/iomgr/executor/threadpool.h +149 -0
  447. data/src/core/lib/iomgr/fork_posix.cc +8 -2
  448. data/src/core/lib/iomgr/iocp_windows.cc +2 -2
  449. data/src/core/lib/iomgr/iomgr.cc +4 -4
  450. data/src/core/lib/iomgr/iomgr_custom.cc +1 -1
  451. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +87 -9
  452. data/src/core/lib/iomgr/iomgr_uv.cc +3 -0
  453. data/src/core/lib/iomgr/is_epollexclusive_available.cc +14 -0
  454. data/src/core/lib/iomgr/load_file.cc +1 -0
  455. data/src/core/lib/iomgr/lockfree_event.cc +13 -12
  456. data/src/core/lib/iomgr/parse_address.cc +238 -0
  457. data/src/core/lib/iomgr/parse_address.h +53 -0
  458. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +87 -0
  459. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +88 -0
  460. data/src/core/lib/iomgr/pollset_custom.cc +5 -5
  461. data/src/core/lib/iomgr/pollset_set_custom.cc +10 -10
  462. data/src/core/lib/iomgr/pollset_uv.h +32 -0
  463. data/src/core/lib/iomgr/pollset_windows.cc +16 -2
  464. data/src/core/lib/iomgr/port.h +10 -22
  465. data/src/core/lib/iomgr/python_util.h +46 -0
  466. data/src/core/lib/iomgr/resolve_address.h +4 -6
  467. data/src/core/lib/iomgr/resolve_address_custom.cc +49 -68
  468. data/src/core/lib/iomgr/resolve_address_custom.h +4 -2
  469. data/src/core/lib/iomgr/resolve_address_posix.cc +20 -24
  470. data/src/core/lib/iomgr/resolve_address_windows.cc +22 -35
  471. data/src/core/lib/iomgr/resource_quota.cc +120 -110
  472. data/src/core/lib/iomgr/resource_quota.h +13 -9
  473. data/src/core/lib/iomgr/sockaddr_utils.cc +33 -36
  474. data/src/core/lib/iomgr/sockaddr_utils.h +12 -16
  475. data/src/core/lib/iomgr/socket_factory_posix.h +2 -3
  476. data/src/core/lib/iomgr/socket_mutator.h +2 -3
  477. data/src/core/lib/iomgr/socket_utils_common_posix.cc +140 -82
  478. data/src/core/lib/iomgr/socket_utils_posix.h +19 -0
  479. data/src/core/lib/iomgr/socket_windows.cc +6 -7
  480. data/src/core/lib/iomgr/socket_windows.h +1 -1
  481. data/src/core/lib/iomgr/tcp_client_cfstream.cc +18 -21
  482. data/src/core/lib/iomgr/tcp_client_custom.cc +9 -11
  483. data/src/core/lib/iomgr/tcp_client_posix.cc +47 -59
  484. data/src/core/lib/iomgr/tcp_client_posix.h +6 -6
  485. data/src/core/lib/iomgr/tcp_client_windows.cc +12 -13
  486. data/src/core/lib/iomgr/tcp_custom.cc +58 -36
  487. data/src/core/lib/iomgr/tcp_custom.h +4 -1
  488. data/src/core/lib/iomgr/tcp_posix.cc +697 -124
  489. data/src/core/lib/iomgr/tcp_server.cc +8 -4
  490. data/src/core/lib/iomgr/tcp_server.h +28 -5
  491. data/src/core/lib/iomgr/tcp_server_custom.cc +46 -41
  492. data/src/core/lib/iomgr/tcp_server_posix.cc +102 -46
  493. data/src/core/lib/iomgr/tcp_server_utils_posix.h +6 -4
  494. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +17 -19
  495. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +10 -18
  496. data/src/core/lib/iomgr/tcp_server_windows.cc +33 -29
  497. data/src/core/lib/iomgr/tcp_uv.cc +8 -8
  498. data/src/core/lib/iomgr/tcp_windows.cc +49 -30
  499. data/src/core/lib/iomgr/time_averaged_stats.h +2 -3
  500. data/src/core/lib/iomgr/timer.h +2 -1
  501. data/src/core/lib/iomgr/timer_custom.cc +7 -5
  502. data/src/core/lib/iomgr/timer_generic.cc +26 -24
  503. data/src/core/lib/iomgr/timer_generic.h +39 -0
  504. data/src/core/lib/iomgr/timer_heap.h +2 -3
  505. data/src/core/lib/iomgr/timer_manager.cc +8 -30
  506. data/src/core/lib/iomgr/timer_manager.h +2 -0
  507. data/src/core/lib/iomgr/udp_server.cc +53 -53
  508. data/src/core/lib/iomgr/udp_server.h +11 -14
  509. data/src/core/lib/iomgr/unix_sockets_posix.cc +9 -14
  510. data/src/core/lib/iomgr/unix_sockets_posix.h +3 -1
  511. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +5 -2
  512. data/src/core/lib/iomgr/work_serializer.cc +155 -0
  513. data/src/core/lib/iomgr/work_serializer.h +65 -0
  514. data/src/core/lib/json/json.h +209 -68
  515. data/src/core/lib/json/json_reader.cc +508 -317
  516. data/src/core/lib/json/json_writer.cc +202 -110
  517. data/src/core/lib/profiling/basic_timers.cc +2 -2
  518. data/src/core/lib/security/authorization/authorization_engine.cc +177 -0
  519. data/src/core/lib/security/authorization/authorization_engine.h +84 -0
  520. data/src/core/lib/security/authorization/evaluate_args.cc +153 -0
  521. data/src/core/lib/security/authorization/evaluate_args.h +59 -0
  522. data/src/core/lib/security/authorization/mock_cel/activation.h +57 -0
  523. data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +42 -0
  524. data/src/core/lib/security/authorization/mock_cel/cel_expression.h +68 -0
  525. data/src/core/lib/security/authorization/mock_cel/cel_value.h +93 -0
  526. data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +67 -0
  527. data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +56 -0
  528. data/src/core/lib/security/authorization/mock_cel/statusor.h +50 -0
  529. data/src/core/lib/security/credentials/alts/alts_credentials.cc +10 -7
  530. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +1 -1
  531. data/src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc +45 -57
  532. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +1 -1
  533. data/src/core/lib/security/credentials/composite/composite_credentials.cc +26 -6
  534. data/src/core/lib/security/credentials/composite/composite_credentials.h +11 -4
  535. data/src/core/lib/security/credentials/credentials.h +31 -25
  536. data/src/core/lib/security/credentials/fake/fake_credentials.cc +9 -9
  537. data/src/core/lib/security/credentials/fake/fake_credentials.h +6 -1
  538. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +8 -6
  539. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +74 -56
  540. data/src/core/lib/security/credentials/iam/iam_credentials.cc +12 -10
  541. data/src/core/lib/security/credentials/iam/iam_credentials.h +4 -0
  542. data/src/core/lib/security/credentials/jwt/json_token.cc +32 -58
  543. data/src/core/lib/security/credentials/jwt/json_token.h +5 -7
  544. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +19 -26
  545. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +12 -0
  546. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +153 -170
  547. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +4 -6
  548. data/src/core/lib/security/credentials/local/local_credentials.cc +3 -3
  549. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +332 -87
  550. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +27 -7
  551. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +31 -15
  552. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +4 -1
  553. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +43 -5
  554. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +12 -2
  555. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +70 -17
  556. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +118 -5
  557. data/src/core/lib/security/credentials/tls/tls_credentials.cc +128 -0
  558. data/src/core/lib/security/credentials/tls/tls_credentials.h +62 -0
  559. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +67 -32
  560. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +5 -0
  561. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +64 -47
  562. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +2 -2
  563. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +9 -5
  564. data/src/core/lib/security/security_connector/local/local_security_connector.cc +42 -16
  565. data/src/core/lib/security/security_connector/security_connector.cc +4 -1
  566. data/src/core/lib/security/security_connector/security_connector.h +22 -20
  567. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +55 -62
  568. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +8 -5
  569. data/src/core/lib/security/security_connector/ssl_utils.cc +150 -53
  570. data/src/core/lib/security/security_connector/ssl_utils.h +41 -17
  571. data/src/core/lib/security/security_connector/ssl_utils_config.cc +32 -0
  572. data/src/core/lib/security/security_connector/ssl_utils_config.h +30 -0
  573. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +606 -0
  574. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +183 -0
  575. data/src/core/lib/security/transport/auth_filters.h +0 -2
  576. data/src/core/lib/security/transport/client_auth_filter.cc +74 -28
  577. data/src/core/lib/security/transport/secure_endpoint.cc +16 -9
  578. data/src/core/lib/security/transport/security_handshaker.cc +103 -43
  579. data/src/core/lib/security/transport/security_handshaker.h +4 -2
  580. data/src/core/lib/security/transport/server_auth_filter.cc +18 -17
  581. data/src/core/lib/security/util/json_util.cc +35 -15
  582. data/src/core/lib/security/util/json_util.h +5 -3
  583. data/src/core/lib/slice/b64.cc +3 -4
  584. data/src/core/lib/slice/b64.h +3 -4
  585. data/src/core/lib/slice/slice.cc +188 -73
  586. data/src/core/lib/slice/slice_buffer.cc +55 -26
  587. data/src/core/lib/slice/slice_intern.cc +164 -64
  588. data/src/core/lib/slice/slice_internal.h +110 -8
  589. data/src/core/lib/slice/slice_string_helpers.cc +10 -1
  590. data/src/core/lib/slice/slice_string_helpers.h +3 -1
  591. data/src/core/lib/slice/slice_utils.h +200 -0
  592. data/src/core/lib/surface/byte_buffer_reader.cc +2 -47
  593. data/src/core/lib/surface/call.cc +166 -117
  594. data/src/core/lib/surface/call.h +8 -8
  595. data/src/core/lib/surface/call_log_batch.cc +51 -60
  596. data/src/core/lib/surface/channel.cc +188 -137
  597. data/src/core/lib/surface/channel.h +91 -11
  598. data/src/core/lib/surface/channel_ping.cc +3 -4
  599. data/src/core/lib/surface/completion_queue.cc +144 -111
  600. data/src/core/lib/surface/completion_queue.h +6 -3
  601. data/src/core/lib/surface/completion_queue_factory.cc +1 -1
  602. data/src/core/lib/surface/event_string.cc +18 -25
  603. data/src/core/lib/surface/event_string.h +3 -1
  604. data/src/core/lib/surface/init.cc +6 -2
  605. data/src/core/lib/surface/init_secure.cc +2 -2
  606. data/src/core/lib/surface/lame_client.cc +43 -30
  607. data/src/core/lib/surface/server.cc +1275 -1316
  608. data/src/core/lib/surface/server.h +373 -52
  609. data/src/core/lib/surface/validate_metadata.cc +18 -8
  610. data/src/core/lib/surface/validate_metadata.h +13 -2
  611. data/src/core/lib/surface/version.cc +2 -2
  612. data/src/core/lib/transport/authority_override.cc +38 -0
  613. data/src/core/lib/transport/authority_override.h +32 -0
  614. data/src/core/lib/transport/byte_stream.cc +5 -7
  615. data/src/core/lib/transport/byte_stream.h +13 -12
  616. data/src/core/lib/transport/connectivity_state.cc +118 -98
  617. data/src/core/lib/transport/connectivity_state.h +114 -50
  618. data/src/core/lib/transport/error_utils.cc +23 -1
  619. data/src/core/lib/transport/error_utils.h +6 -0
  620. data/src/core/lib/transport/metadata.cc +252 -57
  621. data/src/core/lib/transport/metadata.h +168 -80
  622. data/src/core/lib/transport/metadata_batch.cc +78 -16
  623. data/src/core/lib/transport/metadata_batch.h +40 -3
  624. data/src/core/lib/transport/static_metadata.cc +1169 -495
  625. data/src/core/lib/transport/static_metadata.h +279 -282
  626. data/src/core/lib/transport/status_conversion.cc +7 -15
  627. data/src/core/lib/transport/status_metadata.cc +8 -1
  628. data/src/core/lib/transport/status_metadata.h +18 -0
  629. data/src/core/lib/transport/timeout_encoding.cc +7 -0
  630. data/src/core/lib/transport/timeout_encoding.h +3 -2
  631. data/src/core/lib/transport/transport.cc +14 -13
  632. data/src/core/lib/transport/transport.h +48 -8
  633. data/src/core/lib/transport/transport_op_string.cc +67 -105
  634. data/src/core/lib/uri/uri_parser.cc +30 -35
  635. data/src/core/lib/uri/uri_parser.h +5 -4
  636. data/src/core/plugin_registry/grpc_plugin_registry.cc +36 -4
  637. data/src/core/tsi/alts/crypt/aes_gcm.cc +0 -2
  638. data/src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc +1 -1
  639. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +414 -120
  640. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +8 -4
  641. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +1 -1
  642. data/src/core/tsi/alts/handshaker/alts_shared_resource.h +1 -1
  643. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +293 -61
  644. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +15 -5
  645. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +5 -0
  646. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +10 -6
  647. data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +4 -3
  648. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +76 -48
  649. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +34 -26
  650. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +2 -3
  651. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +12 -2
  652. data/src/core/tsi/fake_transport_security.cc +22 -21
  653. data/src/core/tsi/fake_transport_security.h +2 -0
  654. data/src/core/tsi/local_transport_security.cc +8 -6
  655. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -6
  656. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +2 -3
  657. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +11 -9
  658. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -13
  659. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +2 -3
  660. data/src/core/tsi/ssl_transport_security.cc +345 -103
  661. data/src/core/tsi/ssl_transport_security.h +42 -11
  662. data/src/core/tsi/ssl_types.h +0 -2
  663. data/src/core/tsi/transport_security.cc +13 -0
  664. data/src/core/tsi/transport_security.h +6 -9
  665. data/src/core/tsi/transport_security_grpc.cc +7 -0
  666. data/src/core/tsi/transport_security_grpc.h +8 -3
  667. data/src/core/tsi/transport_security_interface.h +20 -3
  668. data/src/ruby/bin/math_pb.rb +5 -5
  669. data/src/ruby/bin/math_services_pb.rb +4 -4
  670. data/src/ruby/ext/grpc/ext-export.clang +1 -0
  671. data/src/ruby/ext/grpc/ext-export.gcc +6 -0
  672. data/src/ruby/ext/grpc/extconf.rb +11 -2
  673. data/src/ruby/ext/grpc/rb_call.c +13 -4
  674. data/src/ruby/ext/grpc/rb_call.h +4 -0
  675. data/src/ruby/ext/grpc/rb_call_credentials.c +61 -13
  676. data/src/ruby/ext/grpc/rb_channel.c +1 -1
  677. data/src/ruby/ext/grpc/rb_channel_credentials.c +9 -0
  678. data/src/ruby/ext/grpc/rb_enable_cpp.cc +22 -0
  679. data/src/ruby/ext/grpc/rb_grpc.c +1 -42
  680. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +16 -6
  681. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +28 -13
  682. data/src/ruby/lib/grpc.rb +2 -0
  683. data/src/ruby/lib/grpc/core/status_codes.rb +135 -0
  684. data/src/ruby/lib/grpc/errors.rb +107 -49
  685. data/src/ruby/lib/grpc/generic/active_call.rb +2 -3
  686. data/src/ruby/lib/grpc/generic/bidi_call.rb +1 -1
  687. data/src/ruby/lib/grpc/generic/client_stub.rb +1 -1
  688. data/src/ruby/lib/grpc/generic/interceptors.rb +5 -5
  689. data/src/ruby/lib/grpc/generic/rpc_server.rb +11 -12
  690. data/src/ruby/lib/grpc/generic/service.rb +5 -4
  691. data/src/ruby/lib/grpc/google_rpc_status_utils.rb +9 -4
  692. data/src/ruby/lib/grpc/grpc.rb +1 -1
  693. data/src/ruby/lib/grpc/structs.rb +15 -0
  694. data/src/ruby/lib/grpc/version.rb +1 -1
  695. data/src/ruby/pb/generate_proto_ruby.sh +5 -3
  696. data/src/ruby/pb/grpc/health/v1/health_pb.rb +3 -3
  697. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +2 -2
  698. data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +1 -1
  699. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +39 -13
  700. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +43 -11
  701. data/src/ruby/spec/channel_credentials_spec.rb +10 -0
  702. data/src/ruby/spec/debug_message_spec.rb +134 -0
  703. data/src/ruby/spec/errors_spec.rb +1 -0
  704. data/src/ruby/spec/generic/active_call_spec.rb +19 -8
  705. data/src/ruby/spec/generic/service_spec.rb +2 -0
  706. data/src/ruby/spec/google_rpc_status_utils_spec.rb +2 -2
  707. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_import.proto +22 -0
  708. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_import2.proto +23 -0
  709. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +41 -0
  710. data/src/ruby/spec/pb/codegen/grpc/testing/same_package_service_name.proto +27 -0
  711. data/src/ruby/spec/pb/codegen/grpc/testing/same_ruby_package_service_name.proto +29 -0
  712. data/src/ruby/spec/pb/codegen/package_option_spec.rb +79 -29
  713. data/src/ruby/spec/support/services.rb +10 -4
  714. data/src/ruby/spec/testdata/ca.pem +18 -13
  715. data/src/ruby/spec/testdata/client.key +26 -14
  716. data/src/ruby/spec/testdata/client.pem +18 -12
  717. data/src/ruby/spec/testdata/server1.key +26 -14
  718. data/src/ruby/spec/testdata/server1.pem +20 -14
  719. data/src/ruby/spec/user_agent_spec.rb +74 -0
  720. data/third_party/abseil-cpp/absl/algorithm/algorithm.h +159 -0
  721. data/third_party/abseil-cpp/absl/algorithm/container.h +1727 -0
  722. data/third_party/abseil-cpp/absl/base/attributes.h +621 -0
  723. data/third_party/abseil-cpp/absl/base/call_once.h +226 -0
  724. data/third_party/abseil-cpp/absl/base/casts.h +184 -0
  725. data/third_party/abseil-cpp/absl/base/config.h +671 -0
  726. data/third_party/abseil-cpp/absl/base/const_init.h +76 -0
  727. data/third_party/abseil-cpp/absl/base/dynamic_annotations.cc +129 -0
  728. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +389 -0
  729. data/third_party/abseil-cpp/absl/base/internal/atomic_hook.h +200 -0
  730. data/third_party/abseil-cpp/absl/base/internal/bits.h +218 -0
  731. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +107 -0
  732. data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +94 -0
  733. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +161 -0
  734. data/third_party/abseil-cpp/absl/base/internal/endian.h +266 -0
  735. data/third_party/abseil-cpp/absl/base/internal/errno_saver.h +43 -0
  736. data/third_party/abseil-cpp/absl/base/internal/exponential_biased.cc +93 -0
  737. data/third_party/abseil-cpp/absl/base/internal/exponential_biased.h +130 -0
  738. data/third_party/abseil-cpp/absl/base/internal/hide_ptr.h +51 -0
  739. data/third_party/abseil-cpp/absl/base/internal/identity.h +37 -0
  740. data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +107 -0
  741. data/third_party/abseil-cpp/absl/base/internal/invoke.h +187 -0
  742. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +620 -0
  743. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +126 -0
  744. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +107 -0
  745. data/third_party/abseil-cpp/absl/base/internal/per_thread_tls.h +52 -0
  746. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +240 -0
  747. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +183 -0
  748. data/third_party/abseil-cpp/absl/base/internal/scheduling_mode.h +58 -0
  749. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +233 -0
  750. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +243 -0
  751. data/third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc +35 -0
  752. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +66 -0
  753. data/third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc +46 -0
  754. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.cc +81 -0
  755. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +93 -0
  756. data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +37 -0
  757. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +416 -0
  758. data/third_party/abseil-cpp/absl/base/internal/sysinfo.h +66 -0
  759. data/third_party/abseil-cpp/absl/base/internal/thread_annotations.h +271 -0
  760. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +152 -0
  761. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +259 -0
  762. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +108 -0
  763. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.h +75 -0
  764. data/third_party/abseil-cpp/absl/base/internal/tsan_mutex_interface.h +66 -0
  765. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +158 -0
  766. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +140 -0
  767. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +124 -0
  768. data/third_party/abseil-cpp/absl/base/log_severity.cc +27 -0
  769. data/third_party/abseil-cpp/absl/base/log_severity.h +121 -0
  770. data/third_party/abseil-cpp/absl/base/macros.h +220 -0
  771. data/third_party/abseil-cpp/absl/base/optimization.h +181 -0
  772. data/third_party/abseil-cpp/absl/base/options.h +211 -0
  773. data/third_party/abseil-cpp/absl/base/policy_checks.h +111 -0
  774. data/third_party/abseil-cpp/absl/base/port.h +26 -0
  775. data/third_party/abseil-cpp/absl/base/thread_annotations.h +280 -0
  776. data/third_party/abseil-cpp/absl/container/fixed_array.h +515 -0
  777. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +503 -0
  778. data/third_party/abseil-cpp/absl/container/inlined_vector.h +848 -0
  779. data/third_party/abseil-cpp/absl/container/internal/common.h +202 -0
  780. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +265 -0
  781. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +440 -0
  782. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +146 -0
  783. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +191 -0
  784. data/third_party/abseil-cpp/absl/container/internal/hashtable_debug_hooks.h +85 -0
  785. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +269 -0
  786. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +297 -0
  787. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +30 -0
  788. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +49 -0
  789. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +892 -0
  790. data/third_party/abseil-cpp/absl/container/internal/layout.h +741 -0
  791. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +48 -0
  792. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +1882 -0
  793. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +138 -0
  794. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.h +32 -0
  795. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +1895 -0
  796. data/third_party/abseil-cpp/absl/debugging/internal/demangle.h +71 -0
  797. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +382 -0
  798. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +134 -0
  799. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +192 -0
  800. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +125 -0
  801. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +70 -0
  802. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +99 -0
  803. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +248 -0
  804. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +24 -0
  805. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +85 -0
  806. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +346 -0
  807. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +128 -0
  808. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +194 -0
  809. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.h +158 -0
  810. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +140 -0
  811. data/third_party/abseil-cpp/absl/debugging/stacktrace.h +231 -0
  812. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +25 -0
  813. data/third_party/abseil-cpp/absl/debugging/symbolize.h +99 -0
  814. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +1480 -0
  815. data/third_party/abseil-cpp/absl/debugging/symbolize_unimplemented.inc +40 -0
  816. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +81 -0
  817. data/third_party/abseil-cpp/absl/functional/function_ref.h +139 -0
  818. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +106 -0
  819. data/third_party/abseil-cpp/absl/hash/hash.h +324 -0
  820. data/third_party/abseil-cpp/absl/hash/internal/city.cc +346 -0
  821. data/third_party/abseil-cpp/absl/hash/internal/city.h +96 -0
  822. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +55 -0
  823. data/third_party/abseil-cpp/absl/hash/internal/hash.h +988 -0
  824. data/third_party/abseil-cpp/absl/memory/memory.h +695 -0
  825. data/third_party/abseil-cpp/absl/meta/type_traits.h +759 -0
  826. data/third_party/abseil-cpp/absl/numeric/int128.cc +404 -0
  827. data/third_party/abseil-cpp/absl/numeric/int128.h +1091 -0
  828. data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +302 -0
  829. data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +308 -0
  830. data/third_party/abseil-cpp/absl/status/status.cc +447 -0
  831. data/third_party/abseil-cpp/absl/status/status.h +428 -0
  832. data/third_party/abseil-cpp/absl/status/status_payload_printer.cc +43 -0
  833. data/third_party/abseil-cpp/absl/status/status_payload_printer.h +51 -0
  834. data/third_party/abseil-cpp/absl/strings/ascii.cc +200 -0
  835. data/third_party/abseil-cpp/absl/strings/ascii.h +242 -0
  836. data/third_party/abseil-cpp/absl/strings/charconv.cc +984 -0
  837. data/third_party/abseil-cpp/absl/strings/charconv.h +119 -0
  838. data/third_party/abseil-cpp/absl/strings/cord.cc +2019 -0
  839. data/third_party/abseil-cpp/absl/strings/cord.h +1121 -0
  840. data/third_party/abseil-cpp/absl/strings/escaping.cc +949 -0
  841. data/third_party/abseil-cpp/absl/strings/escaping.h +164 -0
  842. data/third_party/abseil-cpp/absl/strings/internal/char_map.h +156 -0
  843. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +359 -0
  844. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h +423 -0
  845. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +504 -0
  846. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.h +99 -0
  847. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +151 -0
  848. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +180 -0
  849. data/third_party/abseil-cpp/absl/strings/internal/escaping.h +58 -0
  850. data/third_party/abseil-cpp/absl/strings/internal/memutil.cc +112 -0
  851. data/third_party/abseil-cpp/absl/strings/internal/memutil.h +148 -0
  852. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +36 -0
  853. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.h +89 -0
  854. data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +73 -0
  855. data/third_party/abseil-cpp/absl/strings/internal/stl_type_traits.h +248 -0
  856. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +388 -0
  857. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +432 -0
  858. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +245 -0
  859. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +209 -0
  860. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +326 -0
  861. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +51 -0
  862. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +415 -0
  863. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +493 -0
  864. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +23 -0
  865. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.cc +72 -0
  866. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +104 -0
  867. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +334 -0
  868. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +333 -0
  869. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +314 -0
  870. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +455 -0
  871. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +53 -0
  872. data/third_party/abseil-cpp/absl/strings/internal/utf8.h +50 -0
  873. data/third_party/abseil-cpp/absl/strings/match.cc +40 -0
  874. data/third_party/abseil-cpp/absl/strings/match.h +90 -0
  875. data/third_party/abseil-cpp/absl/strings/numbers.cc +965 -0
  876. data/third_party/abseil-cpp/absl/strings/numbers.h +266 -0
  877. data/third_party/abseil-cpp/absl/strings/str_cat.cc +246 -0
  878. data/third_party/abseil-cpp/absl/strings/str_cat.h +408 -0
  879. data/third_party/abseil-cpp/absl/strings/str_format.h +537 -0
  880. data/third_party/abseil-cpp/absl/strings/str_join.h +293 -0
  881. data/third_party/abseil-cpp/absl/strings/str_replace.cc +82 -0
  882. data/third_party/abseil-cpp/absl/strings/str_replace.h +219 -0
  883. data/third_party/abseil-cpp/absl/strings/str_split.cc +139 -0
  884. data/third_party/abseil-cpp/absl/strings/str_split.h +513 -0
  885. data/third_party/abseil-cpp/absl/strings/string_view.cc +235 -0
  886. data/third_party/abseil-cpp/absl/strings/string_view.h +622 -0
  887. data/third_party/abseil-cpp/absl/strings/strip.h +91 -0
  888. data/third_party/abseil-cpp/absl/strings/substitute.cc +171 -0
  889. data/third_party/abseil-cpp/absl/strings/substitute.h +693 -0
  890. data/third_party/abseil-cpp/absl/synchronization/barrier.cc +52 -0
  891. data/third_party/abseil-cpp/absl/synchronization/barrier.h +79 -0
  892. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +57 -0
  893. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +99 -0
  894. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +140 -0
  895. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +60 -0
  896. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +697 -0
  897. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.h +141 -0
  898. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +155 -0
  899. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +261 -0
  900. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +106 -0
  901. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +115 -0
  902. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +484 -0
  903. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +159 -0
  904. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +2728 -0
  905. data/third_party/abseil-cpp/absl/synchronization/mutex.h +1056 -0
  906. data/third_party/abseil-cpp/absl/synchronization/notification.cc +78 -0
  907. data/third_party/abseil-cpp/absl/synchronization/notification.h +123 -0
  908. data/third_party/abseil-cpp/absl/time/civil_time.cc +175 -0
  909. data/third_party/abseil-cpp/absl/time/civil_time.h +538 -0
  910. data/third_party/abseil-cpp/absl/time/clock.cc +569 -0
  911. data/third_party/abseil-cpp/absl/time/clock.h +74 -0
  912. data/third_party/abseil-cpp/absl/time/duration.cc +922 -0
  913. data/third_party/abseil-cpp/absl/time/format.cc +153 -0
  914. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time.h +332 -0
  915. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +622 -0
  916. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +384 -0
  917. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +102 -0
  918. data/third_party/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc +94 -0
  919. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +140 -0
  920. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.h +52 -0
  921. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +922 -0
  922. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc +45 -0
  923. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +76 -0
  924. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +121 -0
  925. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +93 -0
  926. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +958 -0
  927. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +138 -0
  928. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +308 -0
  929. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.h +55 -0
  930. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +187 -0
  931. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc +159 -0
  932. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.h +132 -0
  933. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +122 -0
  934. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +115 -0
  935. data/third_party/abseil-cpp/absl/time/internal/get_current_time_chrono.inc +31 -0
  936. data/third_party/abseil-cpp/absl/time/internal/get_current_time_posix.inc +24 -0
  937. data/third_party/abseil-cpp/absl/time/time.cc +499 -0
  938. data/third_party/abseil-cpp/absl/time/time.h +1584 -0
  939. data/third_party/abseil-cpp/absl/types/bad_optional_access.cc +48 -0
  940. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +78 -0
  941. data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +64 -0
  942. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +82 -0
  943. data/third_party/abseil-cpp/absl/types/internal/optional.h +396 -0
  944. data/third_party/abseil-cpp/absl/types/internal/span.h +128 -0
  945. data/third_party/abseil-cpp/absl/types/internal/variant.h +1646 -0
  946. data/third_party/abseil-cpp/absl/types/optional.h +776 -0
  947. data/third_party/abseil-cpp/absl/types/span.h +713 -0
  948. data/third_party/abseil-cpp/absl/types/variant.h +861 -0
  949. data/third_party/abseil-cpp/absl/utility/utility.h +350 -0
  950. data/third_party/boringssl-with-bazel/err_data.c +1451 -0
  951. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +271 -0
  952. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +123 -0
  953. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c +93 -0
  954. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_dup.c +87 -0
  955. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +195 -0
  956. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_gentm.c +0 -0
  957. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_i2d_fp.c +88 -0
  958. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +420 -0
  959. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +305 -0
  960. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +286 -0
  961. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_octet.c +0 -0
  962. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_print.c +0 -0
  963. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +313 -0
  964. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +212 -0
  965. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +151 -0
  966. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_utctm.c +0 -0
  967. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_utf8.c +0 -0
  968. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +446 -0
  969. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/asn1_locl.h +0 -0
  970. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/asn1_par.c +0 -0
  971. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +105 -0
  972. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +93 -0
  973. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +97 -0
  974. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c +91 -0
  975. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_dec.c +0 -0
  976. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +664 -0
  977. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_fre.c +0 -0
  978. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_new.c +0 -0
  979. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_typ.c +0 -0
  980. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_utl.c +0 -0
  981. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/time_support.c +0 -0
  982. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +466 -0
  983. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +700 -0
  984. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/bio_mem.c +0 -0
  985. data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +545 -0
  986. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +279 -0
  987. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +317 -0
  988. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/hexdump.c +0 -0
  989. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/internal.h +0 -0
  990. data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +488 -0
  991. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/printf.c +0 -0
  992. data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +206 -0
  993. data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +118 -0
  994. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bn_extra/bn_asn1.c +0 -0
  995. data/third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.c +470 -0
  996. data/third_party/boringssl-with-bazel/src/crypto/buf/buf.c +172 -0
  997. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bytestring/asn1_compat.c +0 -0
  998. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +265 -0
  999. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c +719 -0
  1000. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +688 -0
  1001. data/third_party/boringssl-with-bazel/src/crypto/bytestring/internal.h +96 -0
  1002. data/third_party/boringssl-with-bazel/src/crypto/bytestring/unicode.c +155 -0
  1003. data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +184 -0
  1004. data/third_party/boringssl-with-bazel/src/crypto/chacha/internal.h +45 -0
  1005. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c +143 -0
  1006. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c +152 -0
  1007. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesccm.c +447 -0
  1008. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesctrhmac.c +283 -0
  1009. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesgcmsiv.c +891 -0
  1010. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c +418 -0
  1011. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_null.c +0 -0
  1012. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_rc2.c +0 -0
  1013. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_rc4.c +0 -0
  1014. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +688 -0
  1015. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/internal.h +0 -0
  1016. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +492 -0
  1017. data/third_party/boringssl-with-bazel/src/crypto/cmac/cmac.c +278 -0
  1018. data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +810 -0
  1019. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/conf/conf_def.h +0 -0
  1020. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/conf/internal.h +0 -0
  1021. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-aarch64-fuchsia.c +0 -0
  1022. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-aarch64-linux.c +0 -0
  1023. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +220 -0
  1024. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.h +201 -0
  1025. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-arm.c +0 -0
  1026. data/third_party/boringssl-with-bazel/src/crypto/cpu-intel.c +291 -0
  1027. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-ppc64le.c +0 -0
  1028. data/third_party/boringssl-with-bazel/src/crypto/crypto.c +226 -0
  1029. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c +2159 -0
  1030. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_tables.h +7872 -0
  1031. data/third_party/boringssl-with-bazel/src/crypto/curve25519/internal.h +146 -0
  1032. data/third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c +539 -0
  1033. data/third_party/boringssl-with-bazel/src/crypto/dh/check.c +217 -0
  1034. data/third_party/boringssl-with-bazel/src/crypto/dh/dh.c +533 -0
  1035. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/dh/dh_asn1.c +0 -0
  1036. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/dh/params.c +0 -0
  1037. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/digest_extra/digest_extra.c +0 -0
  1038. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +980 -0
  1039. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/dsa/dsa_asn1.c +0 -0
  1040. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c +574 -0
  1041. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_derive.c +95 -0
  1042. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +385 -0
  1043. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +56 -0
  1044. data/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c +124 -0
  1045. data/third_party/boringssl-with-bazel/src/crypto/ecdsa_extra/ecdsa_asn1.c +267 -0
  1046. data/third_party/boringssl-with-bazel/src/crypto/engine/engine.c +99 -0
  1047. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +850 -0
  1048. data/third_party/boringssl-with-bazel/src/crypto/err/internal.h +58 -0
  1049. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/digestsign.c +0 -0
  1050. data/third_party/boringssl-with-bazel/src/crypto/evp/evp.c +443 -0
  1051. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +547 -0
  1052. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.c +484 -0
  1053. data/third_party/boringssl-with-bazel/src/crypto/evp/internal.h +269 -0
  1054. data/third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c +273 -0
  1055. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c +286 -0
  1056. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c +255 -0
  1057. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519.c +104 -0
  1058. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519_asn1.c +221 -0
  1059. data/third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c +648 -0
  1060. data/third_party/boringssl-with-bazel/src/crypto/evp/p_rsa_asn1.c +194 -0
  1061. data/third_party/boringssl-with-bazel/src/crypto/evp/p_x25519.c +110 -0
  1062. data/third_party/boringssl-with-bazel/src/crypto/evp/p_x25519_asn1.c +248 -0
  1063. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/pbkdf.c +0 -0
  1064. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/print.c +0 -0
  1065. data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +213 -0
  1066. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/sign.c +0 -0
  1067. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/ex_data.c +0 -0
  1068. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes.c +108 -0
  1069. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c +1282 -0
  1070. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/internal.h +238 -0
  1071. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/key_wrap.c +236 -0
  1072. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.c +122 -0
  1073. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +263 -0
  1074. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/add.c +0 -0
  1075. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/asm/x86_64-gcc.c +0 -0
  1076. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn.c +445 -0
  1077. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/bytes.c +0 -0
  1078. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/cmp.c +200 -0
  1079. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/ctx.c +236 -0
  1080. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +886 -0
  1081. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div_extra.c +87 -0
  1082. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +1288 -0
  1083. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd.c +378 -0
  1084. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.c +325 -0
  1085. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/generic.c +0 -0
  1086. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +704 -0
  1087. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/jacobi.c +0 -0
  1088. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c +502 -0
  1089. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery_inv.c +186 -0
  1090. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.c +749 -0
  1091. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/prime.c +1068 -0
  1092. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/random.c +341 -0
  1093. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/rsaz_exp.c +226 -0
  1094. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/rsaz_exp.h +104 -0
  1095. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/shift.c +364 -0
  1096. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/sqrt.c +0 -0
  1097. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/cipher/aead.c +0 -0
  1098. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +620 -0
  1099. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +1302 -0
  1100. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_des.c +237 -0
  1101. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/internal.h +128 -0
  1102. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/delocate.h +89 -0
  1103. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/des/des.c +0 -0
  1104. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/des/internal.h +0 -0
  1105. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c +271 -0
  1106. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +296 -0
  1107. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/digest/internal.h +0 -0
  1108. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/md32_common.h +268 -0
  1109. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +1252 -0
  1110. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +465 -0
  1111. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +524 -0
  1112. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/felem.c +100 -0
  1113. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +776 -0
  1114. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +328 -0
  1115. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +1180 -0
  1116. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64-table.h +9497 -0
  1117. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.c +633 -0
  1118. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.h +153 -0
  1119. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +740 -0
  1120. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256_table.h +297 -0
  1121. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c +175 -0
  1122. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +357 -0
  1123. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +270 -0
  1124. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/util.c +255 -0
  1125. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +270 -0
  1126. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +122 -0
  1127. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +328 -0
  1128. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/fips_shared_support.c +32 -0
  1129. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/hmac/hmac.c +0 -0
  1130. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c +29 -0
  1131. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +256 -0
  1132. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/internal.h +37 -0
  1133. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +301 -0
  1134. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +167 -0
  1135. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c +202 -0
  1136. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +200 -0
  1137. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +729 -0
  1138. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +304 -0
  1139. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +441 -0
  1140. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +96 -0
  1141. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/polyval.c +0 -0
  1142. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/ctrdrbg.c +202 -0
  1143. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.c +137 -0
  1144. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.h +49 -0
  1145. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/getrandom_fillin.h +64 -0
  1146. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +163 -0
  1147. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +378 -0
  1148. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +391 -0
  1149. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/blinding.c +243 -0
  1150. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +127 -0
  1151. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/padding.c +695 -0
  1152. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +898 -0
  1153. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +1358 -0
  1154. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +716 -0
  1155. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/internal.h +53 -0
  1156. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/sha/sha1-altivec.c +0 -0
  1157. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +371 -0
  1158. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +343 -0
  1159. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +544 -0
  1160. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/tls/internal.h +0 -0
  1161. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/tls/kdf.c +0 -0
  1162. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/hkdf/hkdf.c +0 -0
  1163. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +456 -0
  1164. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +192 -0
  1165. data/third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c +2100 -0
  1166. data/third_party/boringssl-with-bazel/src/crypto/hrss/internal.h +61 -0
  1167. data/third_party/boringssl-with-bazel/src/crypto/internal.h +834 -0
  1168. data/third_party/boringssl-with-bazel/src/crypto/lhash/lhash.c +348 -0
  1169. data/third_party/boringssl-with-bazel/src/crypto/mem.c +373 -0
  1170. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +549 -0
  1171. data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +11585 -0
  1172. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/obj/obj_xref.c +0 -0
  1173. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c +261 -0
  1174. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c +360 -0
  1175. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +777 -0
  1176. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_oth.c +87 -0
  1177. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c +257 -0
  1178. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c +218 -0
  1179. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_x509.c +0 -0
  1180. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_xaux.c +0 -0
  1181. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs7/internal.h +0 -0
  1182. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +159 -0
  1183. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +385 -0
  1184. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +138 -0
  1185. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/p5_pbev2.c +316 -0
  1186. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +530 -0
  1187. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1336 -0
  1188. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/poly1305/internal.h +0 -0
  1189. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +318 -0
  1190. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c +305 -0
  1191. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c +856 -0
  1192. data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +45 -0
  1193. data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +220 -0
  1194. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c +52 -0
  1195. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rand_extra/forkunsafe.c +0 -0
  1196. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/fuchsia.c +30 -0
  1197. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rand_extra/rand_extra.c +0 -0
  1198. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c +69 -0
  1199. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rc4/rc4.c +0 -0
  1200. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/refcount_c11.c +0 -0
  1201. data/third_party/boringssl-with-bazel/src/crypto/refcount_lock.c +53 -0
  1202. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rsa_extra/rsa_asn1.c +0 -0
  1203. data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_print.c +22 -0
  1204. data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +82 -0
  1205. data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +431 -0
  1206. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/thread.c +0 -0
  1207. data/third_party/boringssl-with-bazel/src/crypto/thread_none.c +59 -0
  1208. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +210 -0
  1209. data/third_party/boringssl-with-bazel/src/crypto/thread_win.c +260 -0
  1210. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +249 -0
  1211. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +1227 -0
  1212. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +682 -0
  1213. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/a_digest.c +0 -0
  1214. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/a_sign.c +0 -0
  1215. data/third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c +653 -0
  1216. data/third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c +114 -0
  1217. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +161 -0
  1218. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +842 -0
  1219. data/third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c +458 -0
  1220. data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +275 -0
  1221. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/charmap.h +0 -0
  1222. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/i2d_pr.c +0 -0
  1223. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/internal.h +0 -0
  1224. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/rsa_pss.c +0 -0
  1225. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +125 -0
  1226. data/third_party/boringssl-with-bazel/src/crypto/x509/t_req.c +244 -0
  1227. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +544 -0
  1228. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/t_x509a.c +0 -0
  1229. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/vpm_int.h +0 -0
  1230. data/third_party/boringssl-with-bazel/src/crypto/x509/x509.c +90 -0
  1231. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_att.c +0 -0
  1232. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +483 -0
  1233. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_d2.c +0 -0
  1234. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_def.c +103 -0
  1235. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_ext.c +0 -0
  1236. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +834 -0
  1237. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +198 -0
  1238. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c +116 -0
  1239. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +351 -0
  1240. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +226 -0
  1241. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +329 -0
  1242. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c +204 -0
  1243. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_v3.c +0 -0
  1244. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +2506 -0
  1245. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +671 -0
  1246. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +235 -0
  1247. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +389 -0
  1248. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509rset.c +0 -0
  1249. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509spki.c +0 -0
  1250. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_algor.c +0 -0
  1251. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +399 -0
  1252. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_attrib.c +0 -0
  1253. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +563 -0
  1254. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_exten.c +0 -0
  1255. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_info.c +0 -0
  1256. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_name.c +0 -0
  1257. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_pkey.c +0 -0
  1258. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +214 -0
  1259. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_req.c +0 -0
  1260. data/third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c +89 -0
  1261. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_spki.c +0 -0
  1262. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_val.c +0 -0
  1263. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +356 -0
  1264. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_x509a.c +0 -0
  1265. data/third_party/boringssl-with-bazel/src/crypto/x509v3/ext_dat.h +141 -0
  1266. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +61 -0
  1267. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +286 -0
  1268. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_data.c +0 -0
  1269. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_int.h +0 -0
  1270. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_lib.c +0 -0
  1271. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_map.c +0 -0
  1272. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c +189 -0
  1273. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +842 -0
  1274. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +207 -0
  1275. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_akeya.c +0 -0
  1276. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +629 -0
  1277. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_bcons.c +0 -0
  1278. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_bitst.c +0 -0
  1279. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +463 -0
  1280. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +503 -0
  1281. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_crld.c +0 -0
  1282. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +100 -0
  1283. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_extku.c +0 -0
  1284. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +246 -0
  1285. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_ia5.c +0 -0
  1286. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c +218 -0
  1287. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_int.c +0 -0
  1288. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +371 -0
  1289. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_ncons.c +0 -0
  1290. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ocsp.c +68 -0
  1291. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c +288 -0
  1292. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pcia.c +0 -0
  1293. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pcons.c +0 -0
  1294. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pku.c +0 -0
  1295. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pmaps.c +0 -0
  1296. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_prn.c +0 -0
  1297. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +882 -0
  1298. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +155 -0
  1299. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_sxnet.c +0 -0
  1300. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +1395 -0
  1301. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +459 -0
  1302. data/third_party/boringssl-with-bazel/src/include/openssl/aes.h +207 -0
  1303. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +173 -0
  1304. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +911 -0
  1305. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/asn1_mac.h +0 -0
  1306. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/asn1t.h +0 -0
  1307. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +575 -0
  1308. data/third_party/boringssl-with-bazel/src/include/openssl/base64.h +190 -0
  1309. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +933 -0
  1310. data/third_party/boringssl-with-bazel/src/include/openssl/blowfish.h +93 -0
  1311. data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +1057 -0
  1312. data/third_party/boringssl-with-bazel/src/include/openssl/buf.h +137 -0
  1313. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/buffer.h +0 -0
  1314. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +561 -0
  1315. data/third_party/boringssl-with-bazel/src/include/openssl/cast.h +96 -0
  1316. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/chacha.h +0 -0
  1317. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +638 -0
  1318. data/third_party/boringssl-with-bazel/src/include/openssl/cmac.h +91 -0
  1319. data/third_party/boringssl-with-bazel/src/include/openssl/conf.h +180 -0
  1320. data/third_party/boringssl-with-bazel/src/include/openssl/cpu.h +212 -0
  1321. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +149 -0
  1322. data/third_party/boringssl-with-bazel/src/include/openssl/curve25519.h +201 -0
  1323. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/des.h +0 -0
  1324. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +319 -0
  1325. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +331 -0
  1326. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +457 -0
  1327. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/dtls1.h +0 -0
  1328. data/third_party/boringssl-with-bazel/src/include/openssl/e_os2.h +18 -0
  1329. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +424 -0
  1330. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +372 -0
  1331. data/third_party/boringssl-with-bazel/src/include/openssl/ecdh.h +118 -0
  1332. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +205 -0
  1333. data/third_party/boringssl-with-bazel/src/include/openssl/engine.h +109 -0
  1334. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +465 -0
  1335. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +1119 -0
  1336. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ex_data.h +0 -0
  1337. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/hkdf.h +0 -0
  1338. data/third_party/boringssl-with-bazel/src/include/openssl/hmac.h +186 -0
  1339. data/third_party/boringssl-with-bazel/src/include/openssl/hrss.h +100 -0
  1340. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/is_boringssl.h +0 -0
  1341. data/third_party/boringssl-with-bazel/src/include/openssl/lhash.h +282 -0
  1342. data/third_party/boringssl-with-bazel/src/include/openssl/md4.h +108 -0
  1343. data/third_party/boringssl-with-bazel/src/include/openssl/md5.h +109 -0
  1344. data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +175 -0
  1345. data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +4259 -0
  1346. data/third_party/boringssl-with-bazel/src/include/openssl/obj.h +236 -0
  1347. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/obj_mac.h +0 -0
  1348. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/objects.h +0 -0
  1349. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/opensslconf.h +0 -0
  1350. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/opensslv.h +0 -0
  1351. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ossl_typ.h +0 -0
  1352. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +435 -0
  1353. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/pkcs12.h +0 -0
  1354. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +215 -0
  1355. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +269 -0
  1356. data/third_party/boringssl-with-bazel/src/include/openssl/poly1305.h +49 -0
  1357. data/third_party/boringssl-with-bazel/src/include/openssl/pool.h +102 -0
  1358. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +111 -0
  1359. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/rc4.h +0 -0
  1360. data/third_party/boringssl-with-bazel/src/include/openssl/ripemd.h +108 -0
  1361. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +818 -0
  1362. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/safestack.h +0 -0
  1363. data/third_party/boringssl-with-bazel/src/include/openssl/sha.h +294 -0
  1364. data/third_party/boringssl-with-bazel/src/include/openssl/siphash.h +37 -0
  1365. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +199 -0
  1366. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/srtp.h +0 -0
  1367. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +5247 -0
  1368. data/third_party/boringssl-with-bazel/src/include/openssl/ssl3.h +333 -0
  1369. data/third_party/boringssl-with-bazel/src/include/openssl/stack.h +542 -0
  1370. data/third_party/boringssl-with-bazel/src/include/openssl/thread.h +191 -0
  1371. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +631 -0
  1372. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +282 -0
  1373. data/third_party/boringssl-with-bazel/src/include/openssl/type_check.h +90 -0
  1374. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +1292 -0
  1375. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +681 -0
  1376. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +831 -0
  1377. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/bio_ssl.cc +0 -0
  1378. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +837 -0
  1379. data/third_party/boringssl-with-bazel/src/ssl/d1_lib.cc +268 -0
  1380. data/third_party/boringssl-with-bazel/src/ssl/d1_pkt.cc +273 -0
  1381. data/third_party/boringssl-with-bazel/src/ssl/d1_srtp.cc +232 -0
  1382. data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +200 -0
  1383. data/third_party/boringssl-with-bazel/src/ssl/dtls_record.cc +353 -0
  1384. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +675 -0
  1385. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +710 -0
  1386. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +1890 -0
  1387. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +1814 -0
  1388. data/third_party/boringssl-with-bazel/src/ssl/internal.h +3579 -0
  1389. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +724 -0
  1390. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +221 -0
  1391. data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +458 -0
  1392. data/third_party/boringssl-with-bazel/src/ssl/ssl_aead_ctx.cc +432 -0
  1393. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +856 -0
  1394. data/third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc +306 -0
  1395. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +1016 -0
  1396. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +1718 -0
  1397. data/third_party/boringssl-with-bazel/src/ssl/ssl_file.cc +585 -0
  1398. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +397 -0
  1399. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +3053 -0
  1400. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +835 -0
  1401. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +1313 -0
  1402. data/third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc +230 -0
  1403. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +277 -0
  1404. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +394 -0
  1405. data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +1358 -0
  1406. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +386 -0
  1407. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +3895 -0
  1408. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +689 -0
  1409. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +1027 -0
  1410. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +513 -0
  1411. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +1104 -0
  1412. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +317 -0
  1413. data/third_party/boringssl-with-bazel/src/ssl/tls_record.cc +705 -0
  1414. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_32.h +981 -0
  1415. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64.h +619 -0
  1416. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_32.h +3147 -0
  1417. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64.h +1226 -0
  1418. data/third_party/re2/re2/bitmap256.h +117 -0
  1419. data/third_party/re2/re2/bitstate.cc +385 -0
  1420. data/third_party/re2/re2/compile.cc +1279 -0
  1421. data/third_party/re2/re2/dfa.cc +2130 -0
  1422. data/third_party/re2/re2/filtered_re2.cc +121 -0
  1423. data/third_party/re2/re2/filtered_re2.h +109 -0
  1424. data/third_party/re2/re2/mimics_pcre.cc +197 -0
  1425. data/third_party/re2/re2/nfa.cc +713 -0
  1426. data/third_party/re2/re2/onepass.cc +623 -0
  1427. data/third_party/re2/re2/parse.cc +2464 -0
  1428. data/third_party/re2/re2/perl_groups.cc +119 -0
  1429. data/third_party/re2/re2/pod_array.h +55 -0
  1430. data/third_party/re2/re2/prefilter.cc +710 -0
  1431. data/third_party/re2/re2/prefilter.h +108 -0
  1432. data/third_party/re2/re2/prefilter_tree.cc +407 -0
  1433. data/third_party/re2/re2/prefilter_tree.h +139 -0
  1434. data/third_party/re2/re2/prog.cc +988 -0
  1435. data/third_party/re2/re2/prog.h +436 -0
  1436. data/third_party/re2/re2/re2.cc +1362 -0
  1437. data/third_party/re2/re2/re2.h +1002 -0
  1438. data/third_party/re2/re2/regexp.cc +980 -0
  1439. data/third_party/re2/re2/regexp.h +659 -0
  1440. data/third_party/re2/re2/set.cc +154 -0
  1441. data/third_party/re2/re2/set.h +80 -0
  1442. data/third_party/re2/re2/simplify.cc +657 -0
  1443. data/third_party/re2/re2/sparse_array.h +392 -0
  1444. data/third_party/re2/re2/sparse_set.h +264 -0
  1445. data/third_party/re2/re2/stringpiece.cc +65 -0
  1446. data/third_party/re2/re2/stringpiece.h +210 -0
  1447. data/third_party/re2/re2/tostring.cc +351 -0
  1448. data/third_party/re2/re2/unicode_casefold.cc +582 -0
  1449. data/third_party/re2/re2/unicode_casefold.h +78 -0
  1450. data/third_party/re2/re2/unicode_groups.cc +6269 -0
  1451. data/third_party/re2/re2/unicode_groups.h +67 -0
  1452. data/third_party/re2/re2/walker-inl.h +246 -0
  1453. data/third_party/re2/util/benchmark.h +156 -0
  1454. data/third_party/re2/util/flags.h +26 -0
  1455. data/third_party/re2/util/logging.h +109 -0
  1456. data/third_party/re2/util/malloc_counter.h +19 -0
  1457. data/third_party/re2/util/mix.h +41 -0
  1458. data/third_party/re2/util/mutex.h +148 -0
  1459. data/third_party/re2/util/pcre.cc +1025 -0
  1460. data/third_party/re2/util/pcre.h +681 -0
  1461. data/third_party/re2/util/rune.cc +260 -0
  1462. data/third_party/re2/util/strutil.cc +149 -0
  1463. data/third_party/re2/util/strutil.h +21 -0
  1464. data/third_party/re2/util/test.h +50 -0
  1465. data/third_party/re2/util/utf.h +44 -0
  1466. data/third_party/re2/util/util.h +42 -0
  1467. data/third_party/upb/upb/decode.c +621 -0
  1468. data/third_party/upb/upb/decode.h +21 -0
  1469. data/third_party/upb/upb/encode.c +420 -0
  1470. data/third_party/upb/upb/encode.h +21 -0
  1471. data/third_party/upb/upb/msg.c +177 -0
  1472. data/third_party/upb/upb/msg.h +473 -0
  1473. data/third_party/upb/upb/port.c +26 -0
  1474. data/third_party/upb/upb/port_def.inc +179 -0
  1475. data/third_party/upb/upb/port_undef.inc +28 -0
  1476. data/third_party/upb/upb/table.c +880 -0
  1477. data/third_party/upb/upb/table.int.h +466 -0
  1478. data/third_party/upb/upb/upb.c +287 -0
  1479. data/third_party/upb/upb/upb.h +308 -0
  1480. data/third_party/upb/upb/upb.hpp +88 -0
  1481. metadata +1054 -526
  1482. data/src/boringssl/err_data.c +0 -1362
  1483. data/src/core/ext/filters/client_channel/connector.cc +0 -41
  1484. data/src/core/ext/filters/client_channel/health/health.pb.c +0 -23
  1485. data/src/core/ext/filters/client_channel/health/health.pb.h +0 -73
  1486. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/duration.pb.c +0 -19
  1487. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/duration.pb.h +0 -54
  1488. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/timestamp.pb.c +0 -19
  1489. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/timestamp.pb.h +0 -54
  1490. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +0 -89
  1491. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +0 -164
  1492. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +0 -2249
  1493. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel.h +0 -36
  1494. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc +0 -61
  1495. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.cc +0 -85
  1496. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.h +0 -72
  1497. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.cc +0 -307
  1498. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +0 -89
  1499. data/src/core/ext/filters/client_channel/parse_address.cc +0 -234
  1500. data/src/core/ext/filters/client_channel/parse_address.h +0 -53
  1501. data/src/core/ext/filters/client_channel/proxy_mapper.cc +0 -48
  1502. data/src/core/lib/gpr/host_port.cc +0 -98
  1503. data/src/core/lib/gpr/host_port.h +0 -43
  1504. data/src/core/lib/gpr/mpscq.cc +0 -117
  1505. data/src/core/lib/gpr/mpscq.h +0 -88
  1506. data/src/core/lib/gprpp/abstract.h +0 -37
  1507. data/src/core/lib/gprpp/inlined_vector.h +0 -200
  1508. data/src/core/lib/gprpp/optional.h +0 -48
  1509. data/src/core/lib/gprpp/pair.h +0 -38
  1510. data/src/core/lib/json/json.cc +0 -94
  1511. data/src/core/lib/json/json_common.h +0 -34
  1512. data/src/core/lib/json/json_reader.h +0 -146
  1513. data/src/core/lib/json/json_string.cc +0 -367
  1514. data/src/core/lib/json/json_writer.h +0 -84
  1515. data/src/core/lib/security/credentials/tls/spiffe_credentials.cc +0 -129
  1516. data/src/core/lib/security/credentials/tls/spiffe_credentials.h +0 -62
  1517. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +0 -426
  1518. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +0 -122
  1519. data/src/core/lib/security/transport/target_authority_table.cc +0 -75
  1520. data/src/core/lib/security/transport/target_authority_table.h +0 -40
  1521. data/src/core/lib/slice/slice_hash_table.h +0 -205
  1522. data/src/core/lib/slice/slice_weak_hash_table.h +0 -109
  1523. data/src/core/tsi/alts/handshaker/alts_handshaker_service_api.cc +0 -520
  1524. data/src/core/tsi/alts/handshaker/alts_handshaker_service_api.h +0 -323
  1525. data/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.cc +0 -145
  1526. data/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h +0 -149
  1527. data/src/core/tsi/alts/handshaker/altscontext.pb.c +0 -47
  1528. data/src/core/tsi/alts/handshaker/altscontext.pb.h +0 -63
  1529. data/src/core/tsi/alts/handshaker/handshaker.pb.c +0 -122
  1530. data/src/core/tsi/alts/handshaker/handshaker.pb.h +0 -254
  1531. data/src/core/tsi/alts/handshaker/transport_security_common.pb.c +0 -49
  1532. data/src/core/tsi/alts/handshaker/transport_security_common.pb.h +0 -78
  1533. data/src/core/tsi/grpc_shadow_boringssl.h +0 -3006
  1534. data/third_party/boringssl/crypto/asn1/a_bitstr.c +0 -271
  1535. data/third_party/boringssl/crypto/asn1/a_bool.c +0 -110
  1536. data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +0 -297
  1537. data/third_party/boringssl/crypto/asn1/a_dup.c +0 -111
  1538. data/third_party/boringssl/crypto/asn1/a_enum.c +0 -195
  1539. data/third_party/boringssl/crypto/asn1/a_i2d_fp.c +0 -150
  1540. data/third_party/boringssl/crypto/asn1/a_int.c +0 -479
  1541. data/third_party/boringssl/crypto/asn1/a_mbstr.c +0 -411
  1542. data/third_party/boringssl/crypto/asn1/a_object.c +0 -275
  1543. data/third_party/boringssl/crypto/asn1/a_strnid.c +0 -312
  1544. data/third_party/boringssl/crypto/asn1/a_time.c +0 -213
  1545. data/third_party/boringssl/crypto/asn1/a_type.c +0 -151
  1546. data/third_party/boringssl/crypto/asn1/asn1_lib.c +0 -442
  1547. data/third_party/boringssl/crypto/asn1/asn_pack.c +0 -105
  1548. data/third_party/boringssl/crypto/asn1/f_enum.c +0 -93
  1549. data/third_party/boringssl/crypto/asn1/f_int.c +0 -97
  1550. data/third_party/boringssl/crypto/asn1/f_string.c +0 -91
  1551. data/third_party/boringssl/crypto/asn1/tasn_enc.c +0 -662
  1552. data/third_party/boringssl/crypto/base64/base64.c +0 -466
  1553. data/third_party/boringssl/crypto/bio/bio.c +0 -636
  1554. data/third_party/boringssl/crypto/bio/connect.c +0 -542
  1555. data/third_party/boringssl/crypto/bio/fd.c +0 -276
  1556. data/third_party/boringssl/crypto/bio/file.c +0 -315
  1557. data/third_party/boringssl/crypto/bio/pair.c +0 -489
  1558. data/third_party/boringssl/crypto/bio/socket.c +0 -202
  1559. data/third_party/boringssl/crypto/bio/socket_helper.c +0 -114
  1560. data/third_party/boringssl/crypto/bn_extra/convert.c +0 -466
  1561. data/third_party/boringssl/crypto/buf/buf.c +0 -231
  1562. data/third_party/boringssl/crypto/bytestring/ber.c +0 -261
  1563. data/third_party/boringssl/crypto/bytestring/cbb.c +0 -668
  1564. data/third_party/boringssl/crypto/bytestring/cbs.c +0 -618
  1565. data/third_party/boringssl/crypto/bytestring/internal.h +0 -75
  1566. data/third_party/boringssl/crypto/chacha/chacha.c +0 -167
  1567. data/third_party/boringssl/crypto/cipher_extra/cipher_extra.c +0 -114
  1568. data/third_party/boringssl/crypto/cipher_extra/derive_key.c +0 -152
  1569. data/third_party/boringssl/crypto/cipher_extra/e_aesccm.c +0 -203
  1570. data/third_party/boringssl/crypto/cipher_extra/e_aesctrhmac.c +0 -281
  1571. data/third_party/boringssl/crypto/cipher_extra/e_aesgcmsiv.c +0 -867
  1572. data/third_party/boringssl/crypto/cipher_extra/e_chacha20poly1305.c +0 -326
  1573. data/third_party/boringssl/crypto/cipher_extra/e_ssl3.c +0 -460
  1574. data/third_party/boringssl/crypto/cipher_extra/e_tls.c +0 -680
  1575. data/third_party/boringssl/crypto/cipher_extra/tls_cbc.c +0 -482
  1576. data/third_party/boringssl/crypto/cmac/cmac.c +0 -241
  1577. data/third_party/boringssl/crypto/conf/conf.c +0 -803
  1578. data/third_party/boringssl/crypto/cpu-arm-linux.c +0 -363
  1579. data/third_party/boringssl/crypto/cpu-intel.c +0 -288
  1580. data/third_party/boringssl/crypto/crypto.c +0 -198
  1581. data/third_party/boringssl/crypto/curve25519/spake25519.c +0 -539
  1582. data/third_party/boringssl/crypto/dh/check.c +0 -217
  1583. data/third_party/boringssl/crypto/dh/dh.c +0 -519
  1584. data/third_party/boringssl/crypto/dsa/dsa.c +0 -946
  1585. data/third_party/boringssl/crypto/ec_extra/ec_asn1.c +0 -562
  1586. data/third_party/boringssl/crypto/ecdh/ecdh.c +0 -162
  1587. data/third_party/boringssl/crypto/ecdsa_extra/ecdsa_asn1.c +0 -275
  1588. data/third_party/boringssl/crypto/engine/engine.c +0 -98
  1589. data/third_party/boringssl/crypto/err/err.c +0 -847
  1590. data/third_party/boringssl/crypto/err/internal.h +0 -58
  1591. data/third_party/boringssl/crypto/evp/evp.c +0 -362
  1592. data/third_party/boringssl/crypto/evp/evp_asn1.c +0 -337
  1593. data/third_party/boringssl/crypto/evp/evp_ctx.c +0 -446
  1594. data/third_party/boringssl/crypto/evp/internal.h +0 -252
  1595. data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +0 -268
  1596. data/third_party/boringssl/crypto/evp/p_ec.c +0 -239
  1597. data/third_party/boringssl/crypto/evp/p_ec_asn1.c +0 -256
  1598. data/third_party/boringssl/crypto/evp/p_ed25519.c +0 -71
  1599. data/third_party/boringssl/crypto/evp/p_ed25519_asn1.c +0 -190
  1600. data/third_party/boringssl/crypto/evp/p_rsa.c +0 -634
  1601. data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +0 -189
  1602. data/third_party/boringssl/crypto/evp/scrypt.c +0 -209
  1603. data/third_party/boringssl/crypto/fipsmodule/aes/aes.c +0 -1100
  1604. data/third_party/boringssl/crypto/fipsmodule/aes/internal.h +0 -100
  1605. data/third_party/boringssl/crypto/fipsmodule/aes/key_wrap.c +0 -138
  1606. data/third_party/boringssl/crypto/fipsmodule/aes/mode_wrappers.c +0 -112
  1607. data/third_party/boringssl/crypto/fipsmodule/bcm.c +0 -148
  1608. data/third_party/boringssl/crypto/fipsmodule/bn/bn.c +0 -428
  1609. data/third_party/boringssl/crypto/fipsmodule/bn/cmp.c +0 -200
  1610. data/third_party/boringssl/crypto/fipsmodule/bn/ctx.c +0 -303
  1611. data/third_party/boringssl/crypto/fipsmodule/bn/div.c +0 -895
  1612. data/third_party/boringssl/crypto/fipsmodule/bn/exponentiation.c +0 -1356
  1613. data/third_party/boringssl/crypto/fipsmodule/bn/gcd.c +0 -683
  1614. data/third_party/boringssl/crypto/fipsmodule/bn/internal.h +0 -573
  1615. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery.c +0 -526
  1616. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery_inv.c +0 -185
  1617. data/third_party/boringssl/crypto/fipsmodule/bn/mul.c +0 -876
  1618. data/third_party/boringssl/crypto/fipsmodule/bn/prime.c +0 -1154
  1619. data/third_party/boringssl/crypto/fipsmodule/bn/random.c +0 -351
  1620. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.c +0 -231
  1621. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.h +0 -33
  1622. data/third_party/boringssl/crypto/fipsmodule/bn/shift.c +0 -364
  1623. data/third_party/boringssl/crypto/fipsmodule/cipher/cipher.c +0 -615
  1624. data/third_party/boringssl/crypto/fipsmodule/cipher/e_aes.c +0 -1437
  1625. data/third_party/boringssl/crypto/fipsmodule/cipher/e_des.c +0 -233
  1626. data/third_party/boringssl/crypto/fipsmodule/cipher/internal.h +0 -129
  1627. data/third_party/boringssl/crypto/fipsmodule/delocate.h +0 -88
  1628. data/third_party/boringssl/crypto/fipsmodule/digest/digest.c +0 -256
  1629. data/third_party/boringssl/crypto/fipsmodule/digest/digests.c +0 -280
  1630. data/third_party/boringssl/crypto/fipsmodule/digest/md32_common.h +0 -268
  1631. data/third_party/boringssl/crypto/fipsmodule/ec/ec.c +0 -974
  1632. data/third_party/boringssl/crypto/fipsmodule/ec/ec_key.c +0 -453
  1633. data/third_party/boringssl/crypto/fipsmodule/ec/ec_montgomery.c +0 -270
  1634. data/third_party/boringssl/crypto/fipsmodule/ec/internal.h +0 -337
  1635. data/third_party/boringssl/crypto/fipsmodule/ec/oct.c +0 -373
  1636. data/third_party/boringssl/crypto/fipsmodule/ec/p224-64.c +0 -1104
  1637. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64-table.h +0 -9503
  1638. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.c +0 -447
  1639. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.h +0 -117
  1640. data/third_party/boringssl/crypto/fipsmodule/ec/simple.c +0 -1046
  1641. data/third_party/boringssl/crypto/fipsmodule/ec/util.c +0 -104
  1642. data/third_party/boringssl/crypto/fipsmodule/ec/wnaf.c +0 -354
  1643. data/third_party/boringssl/crypto/fipsmodule/ecdsa/ecdsa.c +0 -458
  1644. data/third_party/boringssl/crypto/fipsmodule/is_fips.c +0 -27
  1645. data/third_party/boringssl/crypto/fipsmodule/md4/md4.c +0 -254
  1646. data/third_party/boringssl/crypto/fipsmodule/md5/md5.c +0 -298
  1647. data/third_party/boringssl/crypto/fipsmodule/modes/cbc.c +0 -211
  1648. data/third_party/boringssl/crypto/fipsmodule/modes/ccm.c +0 -256
  1649. data/third_party/boringssl/crypto/fipsmodule/modes/cfb.c +0 -234
  1650. data/third_party/boringssl/crypto/fipsmodule/modes/ctr.c +0 -220
  1651. data/third_party/boringssl/crypto/fipsmodule/modes/gcm.c +0 -1063
  1652. data/third_party/boringssl/crypto/fipsmodule/modes/internal.h +0 -388
  1653. data/third_party/boringssl/crypto/fipsmodule/modes/ofb.c +0 -95
  1654. data/third_party/boringssl/crypto/fipsmodule/rand/ctrdrbg.c +0 -202
  1655. data/third_party/boringssl/crypto/fipsmodule/rand/internal.h +0 -92
  1656. data/third_party/boringssl/crypto/fipsmodule/rand/rand.c +0 -358
  1657. data/third_party/boringssl/crypto/fipsmodule/rand/urandom.c +0 -302
  1658. data/third_party/boringssl/crypto/fipsmodule/rsa/blinding.c +0 -239
  1659. data/third_party/boringssl/crypto/fipsmodule/rsa/internal.h +0 -126
  1660. data/third_party/boringssl/crypto/fipsmodule/rsa/padding.c +0 -692
  1661. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa.c +0 -875
  1662. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa_impl.c +0 -1218
  1663. data/third_party/boringssl/crypto/fipsmodule/self_check/self_check.c +0 -581
  1664. data/third_party/boringssl/crypto/fipsmodule/sha/sha1.c +0 -375
  1665. data/third_party/boringssl/crypto/fipsmodule/sha/sha256.c +0 -337
  1666. data/third_party/boringssl/crypto/fipsmodule/sha/sha512.c +0 -608
  1667. data/third_party/boringssl/crypto/internal.h +0 -739
  1668. data/third_party/boringssl/crypto/lhash/lhash.c +0 -336
  1669. data/third_party/boringssl/crypto/mem.c +0 -235
  1670. data/third_party/boringssl/crypto/obj/obj.c +0 -554
  1671. data/third_party/boringssl/crypto/obj/obj_dat.h +0 -6244
  1672. data/third_party/boringssl/crypto/pem/pem_all.c +0 -262
  1673. data/third_party/boringssl/crypto/pem/pem_info.c +0 -379
  1674. data/third_party/boringssl/crypto/pem/pem_lib.c +0 -776
  1675. data/third_party/boringssl/crypto/pem/pem_oth.c +0 -88
  1676. data/third_party/boringssl/crypto/pem/pem_pk8.c +0 -258
  1677. data/third_party/boringssl/crypto/pem/pem_pkey.c +0 -227
  1678. data/third_party/boringssl/crypto/pkcs7/pkcs7.c +0 -166
  1679. data/third_party/boringssl/crypto/pkcs7/pkcs7_x509.c +0 -233
  1680. data/third_party/boringssl/crypto/pkcs8/internal.h +0 -120
  1681. data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +0 -307
  1682. data/third_party/boringssl/crypto/pkcs8/pkcs8.c +0 -513
  1683. data/third_party/boringssl/crypto/pkcs8/pkcs8_x509.c +0 -789
  1684. data/third_party/boringssl/crypto/poly1305/poly1305.c +0 -318
  1685. data/third_party/boringssl/crypto/poly1305/poly1305_arm.c +0 -304
  1686. data/third_party/boringssl/crypto/poly1305/poly1305_vec.c +0 -839
  1687. data/third_party/boringssl/crypto/pool/internal.h +0 -45
  1688. data/third_party/boringssl/crypto/pool/pool.c +0 -200
  1689. data/third_party/boringssl/crypto/rand_extra/deterministic.c +0 -48
  1690. data/third_party/boringssl/crypto/rand_extra/fuchsia.c +0 -43
  1691. data/third_party/boringssl/crypto/rand_extra/windows.c +0 -53
  1692. data/third_party/boringssl/crypto/refcount_lock.c +0 -53
  1693. data/third_party/boringssl/crypto/stack/stack.c +0 -380
  1694. data/third_party/boringssl/crypto/thread_none.c +0 -59
  1695. data/third_party/boringssl/crypto/thread_pthread.c +0 -206
  1696. data/third_party/boringssl/crypto/thread_win.c +0 -237
  1697. data/third_party/boringssl/crypto/x509/a_strex.c +0 -633
  1698. data/third_party/boringssl/crypto/x509/a_verify.c +0 -115
  1699. data/third_party/boringssl/crypto/x509/algorithm.c +0 -153
  1700. data/third_party/boringssl/crypto/x509/asn1_gen.c +0 -841
  1701. data/third_party/boringssl/crypto/x509/by_dir.c +0 -451
  1702. data/third_party/boringssl/crypto/x509/by_file.c +0 -274
  1703. data/third_party/boringssl/crypto/x509/t_crl.c +0 -128
  1704. data/third_party/boringssl/crypto/x509/t_req.c +0 -246
  1705. data/third_party/boringssl/crypto/x509/t_x509.c +0 -547
  1706. data/third_party/boringssl/crypto/x509/x509.c +0 -157
  1707. data/third_party/boringssl/crypto/x509/x509_cmp.c +0 -477
  1708. data/third_party/boringssl/crypto/x509/x509_def.c +0 -103
  1709. data/third_party/boringssl/crypto/x509/x509_lu.c +0 -725
  1710. data/third_party/boringssl/crypto/x509/x509_obj.c +0 -198
  1711. data/third_party/boringssl/crypto/x509/x509_r2x.c +0 -117
  1712. data/third_party/boringssl/crypto/x509/x509_req.c +0 -322
  1713. data/third_party/boringssl/crypto/x509/x509_set.c +0 -164
  1714. data/third_party/boringssl/crypto/x509/x509_trs.c +0 -326
  1715. data/third_party/boringssl/crypto/x509/x509_txt.c +0 -205
  1716. data/third_party/boringssl/crypto/x509/x509_vfy.c +0 -2476
  1717. data/third_party/boringssl/crypto/x509/x509_vpm.c +0 -670
  1718. data/third_party/boringssl/crypto/x509/x509cset.c +0 -170
  1719. data/third_party/boringssl/crypto/x509/x509name.c +0 -389
  1720. data/third_party/boringssl/crypto/x509/x_all.c +0 -501
  1721. data/third_party/boringssl/crypto/x509/x_crl.c +0 -541
  1722. data/third_party/boringssl/crypto/x509/x_pubkey.c +0 -368
  1723. data/third_party/boringssl/crypto/x509/x_sig.c +0 -69
  1724. data/third_party/boringssl/crypto/x509/x_x509.c +0 -328
  1725. data/third_party/boringssl/crypto/x509v3/ext_dat.h +0 -143
  1726. data/third_party/boringssl/crypto/x509v3/pcy_cache.c +0 -284
  1727. data/third_party/boringssl/crypto/x509v3/pcy_node.c +0 -188
  1728. data/third_party/boringssl/crypto/x509v3/pcy_tree.c +0 -840
  1729. data/third_party/boringssl/crypto/x509v3/v3_akey.c +0 -204
  1730. data/third_party/boringssl/crypto/x509v3/v3_alt.c +0 -623
  1731. data/third_party/boringssl/crypto/x509v3/v3_conf.c +0 -462
  1732. data/third_party/boringssl/crypto/x509v3/v3_cpols.c +0 -502
  1733. data/third_party/boringssl/crypto/x509v3/v3_enum.c +0 -100
  1734. data/third_party/boringssl/crypto/x509v3/v3_genn.c +0 -251
  1735. data/third_party/boringssl/crypto/x509v3/v3_info.c +0 -219
  1736. data/third_party/boringssl/crypto/x509v3/v3_lib.c +0 -370
  1737. data/third_party/boringssl/crypto/x509v3/v3_pci.c +0 -287
  1738. data/third_party/boringssl/crypto/x509v3/v3_purp.c +0 -866
  1739. data/third_party/boringssl/crypto/x509v3/v3_skey.c +0 -152
  1740. data/third_party/boringssl/crypto/x509v3/v3_utl.c +0 -1352
  1741. data/third_party/boringssl/include/openssl/aead.h +0 -433
  1742. data/third_party/boringssl/include/openssl/aes.h +0 -170
  1743. data/third_party/boringssl/include/openssl/arm_arch.h +0 -121
  1744. data/third_party/boringssl/include/openssl/asn1.h +0 -981
  1745. data/third_party/boringssl/include/openssl/base.h +0 -457
  1746. data/third_party/boringssl/include/openssl/base64.h +0 -187
  1747. data/third_party/boringssl/include/openssl/bio.h +0 -902
  1748. data/third_party/boringssl/include/openssl/blowfish.h +0 -93
  1749. data/third_party/boringssl/include/openssl/bn.h +0 -1019
  1750. data/third_party/boringssl/include/openssl/buf.h +0 -137
  1751. data/third_party/boringssl/include/openssl/bytestring.h +0 -505
  1752. data/third_party/boringssl/include/openssl/cast.h +0 -96
  1753. data/third_party/boringssl/include/openssl/cipher.h +0 -608
  1754. data/third_party/boringssl/include/openssl/cmac.h +0 -87
  1755. data/third_party/boringssl/include/openssl/conf.h +0 -183
  1756. data/third_party/boringssl/include/openssl/cpu.h +0 -196
  1757. data/third_party/boringssl/include/openssl/crypto.h +0 -122
  1758. data/third_party/boringssl/include/openssl/curve25519.h +0 -201
  1759. data/third_party/boringssl/include/openssl/dh.h +0 -298
  1760. data/third_party/boringssl/include/openssl/digest.h +0 -316
  1761. data/third_party/boringssl/include/openssl/dsa.h +0 -435
  1762. data/third_party/boringssl/include/openssl/ec.h +0 -413
  1763. data/third_party/boringssl/include/openssl/ec_key.h +0 -342
  1764. data/third_party/boringssl/include/openssl/ecdh.h +0 -101
  1765. data/third_party/boringssl/include/openssl/ecdsa.h +0 -199
  1766. data/third_party/boringssl/include/openssl/engine.h +0 -109
  1767. data/third_party/boringssl/include/openssl/err.h +0 -458
  1768. data/third_party/boringssl/include/openssl/evp.h +0 -873
  1769. data/third_party/boringssl/include/openssl/hmac.h +0 -186
  1770. data/third_party/boringssl/include/openssl/lhash.h +0 -174
  1771. data/third_party/boringssl/include/openssl/lhash_macros.h +0 -174
  1772. data/third_party/boringssl/include/openssl/md4.h +0 -106
  1773. data/third_party/boringssl/include/openssl/md5.h +0 -107
  1774. data/third_party/boringssl/include/openssl/mem.h +0 -156
  1775. data/third_party/boringssl/include/openssl/nid.h +0 -4242
  1776. data/third_party/boringssl/include/openssl/obj.h +0 -233
  1777. data/third_party/boringssl/include/openssl/pem.h +0 -397
  1778. data/third_party/boringssl/include/openssl/pkcs7.h +0 -82
  1779. data/third_party/boringssl/include/openssl/pkcs8.h +0 -230
  1780. data/third_party/boringssl/include/openssl/poly1305.h +0 -51
  1781. data/third_party/boringssl/include/openssl/pool.h +0 -91
  1782. data/third_party/boringssl/include/openssl/rand.h +0 -125
  1783. data/third_party/boringssl/include/openssl/ripemd.h +0 -107
  1784. data/third_party/boringssl/include/openssl/rsa.h +0 -756
  1785. data/third_party/boringssl/include/openssl/sha.h +0 -256
  1786. data/third_party/boringssl/include/openssl/span.h +0 -191
  1787. data/third_party/boringssl/include/openssl/ssl.h +0 -4740
  1788. data/third_party/boringssl/include/openssl/ssl3.h +0 -332
  1789. data/third_party/boringssl/include/openssl/stack.h +0 -485
  1790. data/third_party/boringssl/include/openssl/thread.h +0 -191
  1791. data/third_party/boringssl/include/openssl/tls1.h +0 -618
  1792. data/third_party/boringssl/include/openssl/type_check.h +0 -91
  1793. data/third_party/boringssl/include/openssl/x509.h +0 -1180
  1794. data/third_party/boringssl/include/openssl/x509_vfy.h +0 -614
  1795. data/third_party/boringssl/include/openssl/x509v3.h +0 -827
  1796. data/third_party/boringssl/ssl/custom_extensions.cc +0 -265
  1797. data/third_party/boringssl/ssl/d1_both.cc +0 -851
  1798. data/third_party/boringssl/ssl/d1_lib.cc +0 -267
  1799. data/third_party/boringssl/ssl/d1_pkt.cc +0 -274
  1800. data/third_party/boringssl/ssl/d1_srtp.cc +0 -232
  1801. data/third_party/boringssl/ssl/dtls_method.cc +0 -193
  1802. data/third_party/boringssl/ssl/dtls_record.cc +0 -353
  1803. data/third_party/boringssl/ssl/handoff.cc +0 -285
  1804. data/third_party/boringssl/ssl/handshake.cc +0 -630
  1805. data/third_party/boringssl/ssl/handshake_client.cc +0 -1842
  1806. data/third_party/boringssl/ssl/handshake_server.cc +0 -1674
  1807. data/third_party/boringssl/ssl/internal.h +0 -3064
  1808. data/third_party/boringssl/ssl/s3_both.cc +0 -585
  1809. data/third_party/boringssl/ssl/s3_lib.cc +0 -226
  1810. data/third_party/boringssl/ssl/s3_pkt.cc +0 -425
  1811. data/third_party/boringssl/ssl/ssl_aead_ctx.cc +0 -412
  1812. data/third_party/boringssl/ssl/ssl_asn1.cc +0 -844
  1813. data/third_party/boringssl/ssl/ssl_buffer.cc +0 -286
  1814. data/third_party/boringssl/ssl/ssl_cert.cc +0 -913
  1815. data/third_party/boringssl/ssl/ssl_cipher.cc +0 -1781
  1816. data/third_party/boringssl/ssl/ssl_file.cc +0 -583
  1817. data/third_party/boringssl/ssl/ssl_key_share.cc +0 -252
  1818. data/third_party/boringssl/ssl/ssl_lib.cc +0 -2719
  1819. data/third_party/boringssl/ssl/ssl_privkey.cc +0 -494
  1820. data/third_party/boringssl/ssl/ssl_session.cc +0 -1221
  1821. data/third_party/boringssl/ssl/ssl_stat.cc +0 -224
  1822. data/third_party/boringssl/ssl/ssl_transcript.cc +0 -398
  1823. data/third_party/boringssl/ssl/ssl_versions.cc +0 -399
  1824. data/third_party/boringssl/ssl/ssl_x509.cc +0 -1297
  1825. data/third_party/boringssl/ssl/t1_enc.cc +0 -452
  1826. data/third_party/boringssl/ssl/t1_lib.cc +0 -3783
  1827. data/third_party/boringssl/ssl/tls13_both.cc +0 -559
  1828. data/third_party/boringssl/ssl/tls13_client.cc +0 -891
  1829. data/third_party/boringssl/ssl/tls13_enc.cc +0 -493
  1830. data/third_party/boringssl/ssl/tls13_server.cc +0 -1022
  1831. data/third_party/boringssl/ssl/tls_method.cc +0 -274
  1832. data/third_party/boringssl/ssl/tls_record.cc +0 -703
  1833. data/third_party/boringssl/third_party/fiat/curve25519.c +0 -3230
  1834. data/third_party/boringssl/third_party/fiat/curve25519_tables.h +0 -7880
  1835. data/third_party/boringssl/third_party/fiat/internal.h +0 -154
  1836. data/third_party/boringssl/third_party/fiat/p256.c +0 -1824
  1837. data/third_party/nanopb/pb.h +0 -579
  1838. data/third_party/nanopb/pb_common.c +0 -97
  1839. data/third_party/nanopb/pb_common.h +0 -42
  1840. data/third_party/nanopb/pb_decode.c +0 -1347
  1841. data/third_party/nanopb/pb_decode.h +0 -149
  1842. data/third_party/nanopb/pb_encode.c +0 -696
  1843. data/third_party/nanopb/pb_encode.h +0 -154
@@ -26,12 +26,23 @@
26
26
  #include <stdio.h>
27
27
  #include <string.h>
28
28
 
29
+ #include <set>
30
+
31
+ #include "absl/strings/numbers.h"
32
+ #include "absl/strings/str_cat.h"
33
+ #include "absl/strings/string_view.h"
34
+
29
35
  #include <grpc/support/alloc.h>
30
36
  #include <grpc/support/log.h>
31
37
  #include <grpc/support/string_util.h>
32
38
  #include <grpc/support/sync.h>
33
39
 
40
+ #include "absl/container/inlined_vector.h"
41
+ #include "absl/types/optional.h"
42
+
43
+ #include "src/core/ext/filters/client_channel/backend_metric.h"
34
44
  #include "src/core/ext/filters/client_channel/backup_poller.h"
45
+ #include "src/core/ext/filters/client_channel/config_selector.h"
35
46
  #include "src/core/ext/filters/client_channel/global_subchannel_pool.h"
36
47
  #include "src/core/ext/filters/client_channel/http_connect_handshaker.h"
37
48
  #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
@@ -42,6 +53,7 @@
42
53
  #include "src/core/ext/filters/client_channel/resolving_lb_policy.h"
43
54
  #include "src/core/ext/filters/client_channel/retry_throttle.h"
44
55
  #include "src/core/ext/filters/client_channel/service_config.h"
56
+ #include "src/core/ext/filters/client_channel/service_config_call_data.h"
45
57
  #include "src/core/ext/filters/client_channel/subchannel.h"
46
58
  #include "src/core/ext/filters/deadline/deadline_filter.h"
47
59
  #include "src/core/lib/backoff/backoff.h"
@@ -49,12 +61,12 @@
49
61
  #include "src/core/lib/channel/connected_channel.h"
50
62
  #include "src/core/lib/channel/status_util.h"
51
63
  #include "src/core/lib/gpr/string.h"
52
- #include "src/core/lib/gprpp/inlined_vector.h"
53
64
  #include "src/core/lib/gprpp/manual_constructor.h"
65
+ #include "src/core/lib/gprpp/map.h"
54
66
  #include "src/core/lib/gprpp/sync.h"
55
- #include "src/core/lib/iomgr/combiner.h"
56
67
  #include "src/core/lib/iomgr/iomgr.h"
57
68
  #include "src/core/lib/iomgr/polling_entity.h"
69
+ #include "src/core/lib/iomgr/work_serializer.h"
58
70
  #include "src/core/lib/profiling/timers.h"
59
71
  #include "src/core/lib/slice/slice_internal.h"
60
72
  #include "src/core/lib/slice/slice_string_helpers.h"
@@ -66,7 +78,7 @@
66
78
  #include "src/core/lib/transport/static_metadata.h"
67
79
  #include "src/core/lib/transport/status_metadata.h"
68
80
 
69
- using grpc_core::internal::ClientChannelMethodParsedObject;
81
+ using grpc_core::internal::ClientChannelMethodParsedConfig;
70
82
  using grpc_core::internal::ServerRetryThrottleData;
71
83
 
72
84
  //
@@ -105,7 +117,6 @@ namespace {
105
117
  class ChannelData {
106
118
  public:
107
119
  struct QueuedPick {
108
- LoadBalancingPolicy::PickArgs pick;
109
120
  grpc_call_element* elem;
110
121
  QueuedPick* next = nullptr;
111
122
  };
@@ -118,30 +129,19 @@ class ChannelData {
118
129
  static void GetChannelInfo(grpc_channel_element* elem,
119
130
  const grpc_channel_info* info);
120
131
 
121
- void set_channelz_node(channelz::ClientChannelNode* node) {
122
- channelz_node_ = node;
123
- resolving_lb_policy_->set_channelz_node(node->Ref());
124
- }
125
- void FillChildRefsForChannelz(channelz::ChildRefsList* child_subchannels,
126
- channelz::ChildRefsList* child_channels) {
127
- if (resolving_lb_policy_ != nullptr) {
128
- resolving_lb_policy_->FillChildRefsForChannelz(child_subchannels,
129
- child_channels);
130
- }
131
- }
132
-
133
132
  bool deadline_checking_enabled() const { return deadline_checking_enabled_; }
134
133
  bool enable_retries() const { return enable_retries_; }
135
134
  size_t per_rpc_retry_buffer_size() const {
136
135
  return per_rpc_retry_buffer_size_;
137
136
  }
137
+ grpc_channel_stack* owning_stack() const { return owning_stack_; }
138
138
 
139
139
  // Note: Does NOT return a new ref.
140
140
  grpc_error* disconnect_error() const {
141
141
  return disconnect_error_.Load(MemoryOrder::ACQUIRE);
142
142
  }
143
143
 
144
- grpc_combiner* data_plane_combiner() const { return data_plane_combiner_; }
144
+ Mutex* data_plane_mu() const { return &data_plane_mu_; }
145
145
 
146
146
  LoadBalancingPolicy::SubchannelPicker* picker() const {
147
147
  return picker_.get();
@@ -152,52 +152,58 @@ class ChannelData {
152
152
  bool received_service_config_data() const {
153
153
  return received_service_config_data_;
154
154
  }
155
+ grpc_error* resolver_transient_failure_error() const {
156
+ return resolver_transient_failure_error_;
157
+ }
155
158
  RefCountedPtr<ServerRetryThrottleData> retry_throttle_data() const {
156
159
  return retry_throttle_data_;
157
160
  }
158
161
  RefCountedPtr<ServiceConfig> service_config() const {
159
162
  return service_config_;
160
163
  }
164
+ ConfigSelector* config_selector() const { return config_selector_.get(); }
165
+ WorkSerializer* work_serializer() const { return work_serializer_.get(); }
166
+
167
+ RefCountedPtr<ConnectedSubchannel> GetConnectedSubchannelInDataPlane(
168
+ SubchannelInterface* subchannel) const;
161
169
 
162
170
  grpc_connectivity_state CheckConnectivityState(bool try_to_connect);
171
+
163
172
  void AddExternalConnectivityWatcher(grpc_polling_entity pollent,
164
173
  grpc_connectivity_state* state,
165
174
  grpc_closure* on_complete,
166
175
  grpc_closure* watcher_timer_init) {
167
- // Will delete itself.
168
- New<ExternalConnectivityWatcher>(this, pollent, state, on_complete,
169
- watcher_timer_init);
176
+ new ExternalConnectivityWatcher(this, pollent, state, on_complete,
177
+ watcher_timer_init);
178
+ }
179
+
180
+ void RemoveExternalConnectivityWatcher(grpc_closure* on_complete,
181
+ bool cancel) {
182
+ ExternalConnectivityWatcher::RemoveWatcherFromExternalWatchersMap(
183
+ this, on_complete, cancel);
170
184
  }
185
+
171
186
  int NumExternalConnectivityWatchers() const {
172
- return external_connectivity_watcher_list_.size();
187
+ MutexLock lock(&external_watchers_mu_);
188
+ return static_cast<int>(external_watchers_.size());
173
189
  }
174
190
 
191
+ void AddConnectivityWatcher(
192
+ grpc_connectivity_state initial_state,
193
+ OrphanablePtr<AsyncConnectivityStateWatcherInterface> watcher);
194
+ void RemoveConnectivityWatcher(
195
+ AsyncConnectivityStateWatcherInterface* watcher);
196
+
175
197
  private:
176
- class ConnectivityStateAndPickerSetter;
177
- class ServiceConfigSetter;
198
+ class SubchannelWrapper;
178
199
  class ClientChannelControlHelper;
200
+ class ConnectivityWatcherAdder;
201
+ class ConnectivityWatcherRemover;
179
202
 
180
- class ExternalConnectivityWatcher {
203
+ // Represents a pending connectivity callback from an external caller
204
+ // via grpc_client_channel_watch_connectivity_state().
205
+ class ExternalConnectivityWatcher : public ConnectivityStateWatcherInterface {
181
206
  public:
182
- class WatcherList {
183
- public:
184
- WatcherList() { gpr_mu_init(&mu_); }
185
- ~WatcherList() { gpr_mu_destroy(&mu_); }
186
-
187
- int size() const;
188
- ExternalConnectivityWatcher* Lookup(grpc_closure* on_complete) const;
189
- void Add(ExternalConnectivityWatcher* watcher);
190
- void Remove(const ExternalConnectivityWatcher* watcher);
191
-
192
- private:
193
- // head_ is guarded by a mutex, since the size() method needs to
194
- // iterate over the list, and it's called from the C-core API
195
- // function grpc_channel_num_external_connectivity_watchers(), which
196
- // is synchronous and therefore cannot run in the combiner.
197
- mutable gpr_mu mu_;
198
- ExternalConnectivityWatcher* head_ = nullptr;
199
- };
200
-
201
207
  ExternalConnectivityWatcher(ChannelData* chand, grpc_polling_entity pollent,
202
208
  grpc_connectivity_state* state,
203
209
  grpc_closure* on_complete,
@@ -205,38 +211,75 @@ class ChannelData {
205
211
 
206
212
  ~ExternalConnectivityWatcher();
207
213
 
214
+ // Removes the watcher from the external_watchers_ map.
215
+ static void RemoveWatcherFromExternalWatchersMap(ChannelData* chand,
216
+ grpc_closure* on_complete,
217
+ bool cancel);
218
+
219
+ void Notify(grpc_connectivity_state state,
220
+ const absl::Status& /* status */) override;
221
+
222
+ void Cancel();
223
+
208
224
  private:
209
- static void OnWatchCompleteLocked(void* arg, grpc_error* error);
210
- static void WatchConnectivityStateLocked(void* arg, grpc_error* ignored);
225
+ // Adds the watcher to state_tracker_. Consumes the ref that is passed to it
226
+ // from Start().
227
+ void AddWatcherLocked();
228
+ void RemoveWatcherLocked();
211
229
 
212
230
  ChannelData* chand_;
213
231
  grpc_polling_entity pollent_;
232
+ grpc_connectivity_state initial_state_;
214
233
  grpc_connectivity_state* state_;
215
234
  grpc_closure* on_complete_;
216
235
  grpc_closure* watcher_timer_init_;
217
- grpc_closure my_closure_;
218
- ExternalConnectivityWatcher* next_ = nullptr;
236
+ Atomic<bool> done_{false};
237
+ };
238
+
239
+ class ChannelConfigHelper
240
+ : public ResolvingLoadBalancingPolicy::ChannelConfigHelper {
241
+ public:
242
+ explicit ChannelConfigHelper(ChannelData* chand) : chand_(chand) {}
243
+
244
+ ApplyServiceConfigResult ApplyServiceConfig(
245
+ const Resolver::Result& result) override;
246
+
247
+ void ApplyConfigSelector(
248
+ bool service_config_changed,
249
+ RefCountedPtr<ConfigSelector> config_selector) override;
250
+
251
+ void ResolverTransientFailure(grpc_error* error) override;
252
+
253
+ private:
254
+ static void ProcessLbPolicy(
255
+ const Resolver::Result& resolver_result,
256
+ const internal::ClientChannelGlobalParsedConfig* parsed_service_config,
257
+ RefCountedPtr<LoadBalancingPolicy::Config>* lb_policy_config);
258
+
259
+ ChannelData* chand_;
219
260
  };
220
261
 
221
262
  ChannelData(grpc_channel_element_args* args, grpc_error** error);
222
263
  ~ChannelData();
223
264
 
224
- static bool ProcessResolverResultLocked(
225
- void* arg, const Resolver::Result& result, const char** lb_policy_name,
226
- RefCountedPtr<ParsedLoadBalancingConfig>* lb_policy_config,
227
- grpc_error** service_config_error);
265
+ void UpdateStateAndPickerLocked(
266
+ grpc_connectivity_state state, const absl::Status& status,
267
+ const char* reason,
268
+ std::unique_ptr<LoadBalancingPolicy::SubchannelPicker> picker);
228
269
 
229
- grpc_error* DoPingLocked(grpc_transport_op* op);
270
+ void UpdateServiceConfigInDataPlaneLocked(
271
+ bool service_config_changed,
272
+ RefCountedPtr<ConfigSelector> config_selector);
230
273
 
231
- static void StartTransportOpLocked(void* arg, grpc_error* ignored);
274
+ void CreateResolvingLoadBalancingPolicyLocked();
232
275
 
233
- static void TryToConnectLocked(void* arg, grpc_error* error_ignored);
276
+ void DestroyResolvingLoadBalancingPolicyLocked();
234
277
 
235
- void ProcessLbPolicy(
236
- const Resolver::Result& resolver_result,
237
- const internal::ClientChannelGlobalParsedObject* parsed_service_config,
238
- UniquePtr<char>* lb_policy_name,
239
- RefCountedPtr<ParsedLoadBalancingConfig>* lb_policy_config);
278
+ grpc_error* DoPingLocked(grpc_transport_op* op);
279
+
280
+ void StartTransportOpLocked(grpc_transport_op* op);
281
+
282
+ void TryToConnectLocked();
240
283
 
241
284
  //
242
285
  // Fields set at construction and never modified.
@@ -246,37 +289,54 @@ class ChannelData {
246
289
  const size_t per_rpc_retry_buffer_size_;
247
290
  grpc_channel_stack* owning_stack_;
248
291
  ClientChannelFactory* client_channel_factory_;
249
- UniquePtr<char> server_name_;
292
+ const grpc_channel_args* channel_args_;
250
293
  RefCountedPtr<ServiceConfig> default_service_config_;
251
- // Initialized shortly after construction.
252
- channelz::ClientChannelNode* channelz_node_ = nullptr;
294
+ grpc_core::UniquePtr<char> server_name_;
295
+ grpc_core::UniquePtr<char> target_uri_;
296
+ channelz::ChannelNode* channelz_node_;
297
+ ChannelConfigHelper channel_config_helper_;
253
298
 
254
299
  //
255
- // Fields used in the data plane. Guarded by data_plane_combiner.
300
+ // Fields used in the data plane. Guarded by data_plane_mu.
256
301
  //
257
- grpc_combiner* data_plane_combiner_;
258
- UniquePtr<LoadBalancingPolicy::SubchannelPicker> picker_;
302
+ mutable Mutex data_plane_mu_;
303
+ std::unique_ptr<LoadBalancingPolicy::SubchannelPicker> picker_;
259
304
  QueuedPick* queued_picks_ = nullptr; // Linked list of queued picks.
260
305
  // Data from service config.
306
+ grpc_error* resolver_transient_failure_error_ = GRPC_ERROR_NONE;
261
307
  bool received_service_config_data_ = false;
262
308
  RefCountedPtr<ServerRetryThrottleData> retry_throttle_data_;
263
309
  RefCountedPtr<ServiceConfig> service_config_;
310
+ RefCountedPtr<ConfigSelector> config_selector_;
264
311
 
265
312
  //
266
- // Fields used in the control plane. Guarded by combiner.
313
+ // Fields used in the control plane. Guarded by work_serializer.
267
314
  //
268
- grpc_combiner* combiner_;
315
+ std::shared_ptr<WorkSerializer> work_serializer_;
269
316
  grpc_pollset_set* interested_parties_;
270
317
  RefCountedPtr<SubchannelPoolInterface> subchannel_pool_;
271
- OrphanablePtr<LoadBalancingPolicy> resolving_lb_policy_;
272
- grpc_connectivity_state_tracker state_tracker_;
273
- ExternalConnectivityWatcher::WatcherList external_connectivity_watcher_list_;
274
- UniquePtr<char> health_check_service_name_;
318
+ OrphanablePtr<ResolvingLoadBalancingPolicy> resolving_lb_policy_;
319
+ ConnectivityStateTracker state_tracker_;
320
+ grpc_core::UniquePtr<char> health_check_service_name_;
275
321
  RefCountedPtr<ServiceConfig> saved_service_config_;
322
+ RefCountedPtr<ConfigSelector> saved_config_selector_;
276
323
  bool received_first_resolver_result_ = false;
324
+ // The number of SubchannelWrapper instances referencing a given Subchannel.
325
+ std::map<Subchannel*, int> subchannel_refcount_map_;
326
+ // The set of SubchannelWrappers that currently exist.
327
+ // No need to hold a ref, since the map is updated in the control-plane
328
+ // work_serializer when the SubchannelWrappers are created and destroyed.
329
+ std::set<SubchannelWrapper*> subchannel_wrappers_;
330
+ // Pending ConnectedSubchannel updates for each SubchannelWrapper.
331
+ // Updates are queued here in the control plane work_serializer and then
332
+ // applied in the data plane mutex when the picker is updated.
333
+ std::map<RefCountedPtr<SubchannelWrapper>, RefCountedPtr<ConnectedSubchannel>>
334
+ pending_subchannel_updates_;
335
+ int keepalive_time_ = -1;
277
336
 
278
337
  //
279
- // Fields accessed from both data plane and control plane combiners.
338
+ // Fields accessed from both data plane mutex and control plane
339
+ // work_serializer.
280
340
  //
281
341
  Atomic<grpc_error*> disconnect_error_;
282
342
 
@@ -285,8 +345,16 @@ class ChannelData {
285
345
  // synchronously via get_channel_info().
286
346
  //
287
347
  gpr_mu info_mu_;
288
- UniquePtr<char> info_lb_policy_name_;
289
- UniquePtr<char> info_service_config_json_;
348
+ grpc_core::UniquePtr<char> info_lb_policy_name_;
349
+ grpc_core::UniquePtr<char> info_service_config_json_;
350
+
351
+ //
352
+ // Fields guarded by a mutex, since they need to be accessed
353
+ // synchronously via grpc_channel_num_external_connectivity_watchers().
354
+ //
355
+ mutable Mutex external_watchers_mu_;
356
+ std::map<grpc_closure*, RefCountedPtr<ExternalConnectivityWatcher>>
357
+ external_watchers_;
290
358
  };
291
359
 
292
360
  //
@@ -306,15 +374,112 @@ class CallData {
306
374
 
307
375
  RefCountedPtr<SubchannelCall> subchannel_call() { return subchannel_call_; }
308
376
 
309
- // Invoked by channel for queued picks once resolver results are available.
310
- void MaybeApplyServiceConfigToCallLocked(grpc_call_element* elem);
311
-
312
377
  // Invoked by channel for queued picks when the picker is updated.
313
- static void StartPickLocked(void* arg, grpc_error* error);
378
+ static void PickSubchannel(void* arg, grpc_error* error);
379
+
380
+ // Helper function for performing a pick while holding the data plane
381
+ // mutex. Returns true if the pick is complete, in which case the caller
382
+ // must invoke PickDone() or AsyncPickDone() with the returned error.
383
+ bool PickSubchannelLocked(grpc_call_element* elem, grpc_error** error);
384
+
385
+ // Schedules a callback to process the completed pick. The callback
386
+ // will not run until after this method returns.
387
+ void AsyncPickDone(grpc_call_element* elem, grpc_error* error);
314
388
 
315
389
  private:
316
390
  class QueuedPickCanceller;
317
391
 
392
+ class Metadata : public LoadBalancingPolicy::MetadataInterface {
393
+ public:
394
+ Metadata(CallData* calld, grpc_metadata_batch* batch)
395
+ : calld_(calld), batch_(batch) {}
396
+
397
+ void Add(absl::string_view key, absl::string_view value) override {
398
+ grpc_linked_mdelem* linked_mdelem = static_cast<grpc_linked_mdelem*>(
399
+ calld_->arena_->Alloc(sizeof(grpc_linked_mdelem)));
400
+ linked_mdelem->md = grpc_mdelem_from_slices(
401
+ grpc_core::ExternallyManagedSlice(key.data(), key.size()),
402
+ grpc_core::ExternallyManagedSlice(value.data(), value.size()));
403
+ GPR_ASSERT(grpc_metadata_batch_link_tail(batch_, linked_mdelem) ==
404
+ GRPC_ERROR_NONE);
405
+ }
406
+
407
+ iterator begin() const override {
408
+ static_assert(sizeof(grpc_linked_mdelem*) <= sizeof(intptr_t),
409
+ "iterator size too large");
410
+ return iterator(
411
+ this, reinterpret_cast<intptr_t>(MaybeSkipEntry(batch_->list.head)));
412
+ }
413
+ iterator end() const override {
414
+ static_assert(sizeof(grpc_linked_mdelem*) <= sizeof(intptr_t),
415
+ "iterator size too large");
416
+ return iterator(this, 0);
417
+ }
418
+
419
+ iterator erase(iterator it) override {
420
+ grpc_linked_mdelem* linked_mdelem =
421
+ reinterpret_cast<grpc_linked_mdelem*>(GetIteratorHandle(it));
422
+ intptr_t handle = reinterpret_cast<intptr_t>(linked_mdelem->next);
423
+ grpc_metadata_batch_remove(batch_, linked_mdelem);
424
+ return iterator(this, handle);
425
+ }
426
+
427
+ private:
428
+ grpc_linked_mdelem* MaybeSkipEntry(grpc_linked_mdelem* entry) const {
429
+ if (entry != nullptr && batch_->idx.named.path == entry) {
430
+ return entry->next;
431
+ }
432
+ return entry;
433
+ }
434
+
435
+ intptr_t IteratorHandleNext(intptr_t handle) const override {
436
+ grpc_linked_mdelem* linked_mdelem =
437
+ reinterpret_cast<grpc_linked_mdelem*>(handle);
438
+ return reinterpret_cast<intptr_t>(MaybeSkipEntry(linked_mdelem->next));
439
+ }
440
+
441
+ std::pair<absl::string_view, absl::string_view> IteratorHandleGet(
442
+ intptr_t handle) const override {
443
+ grpc_linked_mdelem* linked_mdelem =
444
+ reinterpret_cast<grpc_linked_mdelem*>(handle);
445
+ return std::make_pair(
446
+ StringViewFromSlice(GRPC_MDKEY(linked_mdelem->md)),
447
+ StringViewFromSlice(GRPC_MDVALUE(linked_mdelem->md)));
448
+ }
449
+
450
+ CallData* calld_;
451
+ grpc_metadata_batch* batch_;
452
+ };
453
+
454
+ class LbCallState : public LoadBalancingPolicy::CallState {
455
+ public:
456
+ explicit LbCallState(CallData* calld) : calld_(calld) {}
457
+
458
+ void* Alloc(size_t size) override { return calld_->arena_->Alloc(size); }
459
+
460
+ const LoadBalancingPolicy::BackendMetricData* GetBackendMetricData()
461
+ override {
462
+ if (calld_->backend_metric_data_ == nullptr) {
463
+ grpc_linked_mdelem* md = calld_->recv_trailing_metadata_->idx.named
464
+ .x_endpoint_load_metrics_bin;
465
+ if (md != nullptr) {
466
+ calld_->backend_metric_data_ =
467
+ ParseBackendMetricData(GRPC_MDVALUE(md->md), calld_->arena_);
468
+ }
469
+ }
470
+ return calld_->backend_metric_data_;
471
+ }
472
+
473
+ absl::string_view ExperimentalGetCallAttribute(const char* key) override {
474
+ auto it = calld_->call_attributes_.find(key);
475
+ if (it == calld_->call_attributes_.end()) return absl::string_view();
476
+ return it->second;
477
+ }
478
+
479
+ private:
480
+ CallData* calld_;
481
+ };
482
+
318
483
  // State used for starting a retryable batch on a subchannel call.
319
484
  // This provides its own grpc_transport_stream_op_batch and other data
320
485
  // structures needed to populate the ops in the batch.
@@ -450,8 +615,9 @@ class CallData {
450
615
  grpc_call_element* elem, SubchannelCallBatchData* batch_data,
451
616
  SubchannelCallRetryState* retry_state);
452
617
 
453
- static void MaybeInjectRecvTrailingMetadataReadyForLoadBalancingPolicy(
454
- const LoadBalancingPolicy::PickArgs& pick,
618
+ static void RecvTrailingMetadataReadyForLoadBalancingPolicy(
619
+ void* arg, grpc_error* error);
620
+ void MaybeInjectRecvTrailingMetadataReadyForLoadBalancingPolicy(
455
621
  grpc_transport_stream_op_batch* batch);
456
622
 
457
623
  // Returns the index into pending_batches_ to be used for batch.
@@ -464,10 +630,10 @@ class CallData {
464
630
  // A predicate type and some useful implementations for PendingBatchesFail().
465
631
  typedef bool (*YieldCallCombinerPredicate)(
466
632
  const CallCombinerClosureList& closures);
467
- static bool YieldCallCombiner(const CallCombinerClosureList& closures) {
633
+ static bool YieldCallCombiner(const CallCombinerClosureList& /*closures*/) {
468
634
  return true;
469
635
  }
470
- static bool NoYieldCallCombiner(const CallCombinerClosureList& closures) {
636
+ static bool NoYieldCallCombiner(const CallCombinerClosureList& /*closures*/) {
471
637
  return false;
472
638
  }
473
639
  static bool YieldCallCombinerIfPendingBatchesFound(
@@ -513,8 +679,8 @@ class CallData {
513
679
 
514
680
  // Sets *status and *server_pushback_md based on md_batch and error.
515
681
  // Only sets *server_pushback_md if server_pushback_md != nullptr.
516
- void GetCallStatus(grpc_call_element* elem, grpc_metadata_batch* md_batch,
517
- grpc_error* error, grpc_status_code* status,
682
+ void GetCallStatus(grpc_metadata_batch* md_batch, grpc_error* error,
683
+ grpc_status_code* status,
518
684
  grpc_mdelem** server_pushback_md);
519
685
  // Adds recv_trailing_metadata_ready closure to closures.
520
686
  void AddClosureForRecvTrailingMetadataReady(
@@ -543,10 +709,10 @@ class CallData {
543
709
 
544
710
  // Adds the on_complete closure for the pending batch completed in
545
711
  // batch_data to closures.
546
- void AddClosuresForCompletedPendingBatch(
547
- grpc_call_element* elem, SubchannelCallBatchData* batch_data,
548
- SubchannelCallRetryState* retry_state, grpc_error* error,
549
- CallCombinerClosureList* closures);
712
+ void AddClosuresForCompletedPendingBatch(grpc_call_element* elem,
713
+ SubchannelCallBatchData* batch_data,
714
+ grpc_error* error,
715
+ CallCombinerClosureList* closures);
550
716
 
551
717
  // If there are any cached ops to replay or pending ops to start on the
552
718
  // subchannel call, adds a closure to closures to invoke
@@ -604,13 +770,17 @@ class CallData {
604
770
  void CreateSubchannelCall(grpc_call_element* elem);
605
771
  // Invoked when a pick is completed, on both success or failure.
606
772
  static void PickDone(void* arg, grpc_error* error);
607
- // Removes the call from the channel's list of queued picks.
608
- void RemoveCallFromQueuedPicksLocked(grpc_call_element* elem);
609
- // Adds the call to the channel's list of queued picks.
610
- void AddCallToQueuedPicksLocked(grpc_call_element* elem);
773
+ // Removes the call from the channel's list of queued picks if present.
774
+ void MaybeRemoveCallFromQueuedPicksLocked(grpc_call_element* elem);
775
+ // Adds the call to the channel's list of queued picks if not already present.
776
+ void MaybeAddCallToQueuedPicksLocked(grpc_call_element* elem);
611
777
  // Applies service config to the call. Must be invoked once we know
612
778
  // that the resolver has returned results to the channel.
613
- void ApplyServiceConfigToCallLocked(grpc_call_element* elem);
779
+ // If an error is returned, the error indicates the status with which
780
+ // the call should be failed.
781
+ grpc_error* ApplyServiceConfigToCallLocked(
782
+ grpc_call_element* elem, grpc_metadata_batch* initial_metadata);
783
+ void MaybeInvokeConfigSelectorCommitCallback();
614
784
 
615
785
  // State for handling deadlines.
616
786
  // The code in deadline_filter.c requires this to be the first field.
@@ -621,7 +791,7 @@ class CallData {
621
791
  grpc_deadline_state deadline_state_;
622
792
 
623
793
  grpc_slice path_; // Request path.
624
- gpr_timespec call_start_time_;
794
+ gpr_cycle_counter call_start_time_;
625
795
  grpc_millis deadline_;
626
796
  Arena* arena_;
627
797
  grpc_call_stack* owning_call_;
@@ -629,8 +799,9 @@ class CallData {
629
799
  grpc_call_context_element* call_context_;
630
800
 
631
801
  RefCountedPtr<ServerRetryThrottleData> retry_throttle_data_;
632
- ServiceConfig::CallData service_config_call_data_;
633
- const ClientChannelMethodParsedObject* method_params_ = nullptr;
802
+ const ClientChannelMethodParsedConfig* method_params_ = nullptr;
803
+ std::map<const char*, absl::string_view> call_attributes_;
804
+ std::function<void()> on_call_committed_;
634
805
 
635
806
  RefCountedPtr<SubchannelCall> subchannel_call_;
636
807
 
@@ -641,8 +812,19 @@ class CallData {
641
812
  bool pick_queued_ = false;
642
813
  bool service_config_applied_ = false;
643
814
  QueuedPickCanceller* pick_canceller_ = nullptr;
815
+ LbCallState lb_call_state_;
816
+ const LoadBalancingPolicy::BackendMetricData* backend_metric_data_ = nullptr;
817
+ RefCountedPtr<ConnectedSubchannel> connected_subchannel_;
818
+ std::function<void(grpc_error*, LoadBalancingPolicy::MetadataInterface*,
819
+ LoadBalancingPolicy::CallState*)>
820
+ lb_recv_trailing_metadata_ready_;
644
821
  grpc_closure pick_closure_;
645
822
 
823
+ // For intercepting recv_trailing_metadata_ready for the LB policy.
824
+ grpc_metadata_batch* recv_trailing_metadata_ = nullptr;
825
+ grpc_closure recv_trailing_metadata_ready_;
826
+ grpc_closure* original_recv_trailing_metadata_ready_ = nullptr;
827
+
646
828
  grpc_polling_entity* pollent_ = nullptr;
647
829
 
648
830
  // Batches are added to this list when received from above.
@@ -688,7 +870,7 @@ class CallData {
688
870
  // Note: We inline the cache for the first 3 send_message ops and use
689
871
  // dynamic allocation after that. This number was essentially picked
690
872
  // at random; it could be changed in the future to tune performance.
691
- InlinedVector<ByteStreamCache*, 3> send_messages_;
873
+ absl::InlinedVector<ByteStreamCache*, 3> send_messages_;
692
874
  // send_trailing_metadata
693
875
  bool seen_send_trailing_metadata_ = false;
694
876
  grpc_linked_mdelem* send_trailing_metadata_storage_ = nullptr;
@@ -696,176 +878,314 @@ class CallData {
696
878
  };
697
879
 
698
880
  //
699
- // ChannelData::ConnectivityStateAndPickerSetter
881
+ // ChannelData::SubchannelWrapper
700
882
  //
701
883
 
702
- // A fire-and-forget class that sets the channel's connectivity state
703
- // and then hops into the data plane combiner to update the picker.
704
- // Must be instantiated while holding the control plane combiner.
705
- // Deletes itself when done.
706
- class ChannelData::ConnectivityStateAndPickerSetter {
884
+ // This class is a wrapper for Subchannel that hides details of the
885
+ // channel's implementation (such as the health check service name and
886
+ // connected subchannel) from the LB policy API.
887
+ //
888
+ // Note that no synchronization is needed here, because even if the
889
+ // underlying subchannel is shared between channels, this wrapper will only
890
+ // be used within one channel, so it will always be synchronized by the
891
+ // control plane work_serializer.
892
+ class ChannelData::SubchannelWrapper : public SubchannelInterface {
707
893
  public:
708
- ConnectivityStateAndPickerSetter(
709
- ChannelData* chand, grpc_connectivity_state state, const char* reason,
710
- UniquePtr<LoadBalancingPolicy::SubchannelPicker> picker)
711
- : chand_(chand), picker_(std::move(picker)) {
712
- // Update connectivity state here, while holding control plane combiner.
713
- grpc_connectivity_state_set(&chand->state_tracker_, state, reason);
714
- if (chand->channelz_node_ != nullptr) {
715
- chand->channelz_node_->AddTraceEvent(
716
- channelz::ChannelTrace::Severity::Info,
717
- grpc_slice_from_static_string(
718
- GetChannelConnectivityStateChangeString(state)));
719
- }
720
- // Bounce into the data plane combiner to reset the picker.
721
- GRPC_CHANNEL_STACK_REF(chand->owning_stack_,
722
- "ConnectivityStateAndPickerSetter");
723
- GRPC_CLOSURE_INIT(&closure_, SetPicker, this,
724
- grpc_combiner_scheduler(chand->data_plane_combiner_));
725
- GRPC_CLOSURE_SCHED(&closure_, GRPC_ERROR_NONE);
894
+ SubchannelWrapper(ChannelData* chand, Subchannel* subchannel,
895
+ grpc_core::UniquePtr<char> health_check_service_name)
896
+ : SubchannelInterface(&grpc_client_channel_routing_trace),
897
+ chand_(chand),
898
+ subchannel_(subchannel),
899
+ health_check_service_name_(std::move(health_check_service_name)) {
900
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
901
+ gpr_log(GPR_INFO,
902
+ "chand=%p: creating subchannel wrapper %p for subchannel %p",
903
+ chand, this, subchannel_);
904
+ }
905
+ GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "SubchannelWrapper");
906
+ auto* subchannel_node = subchannel_->channelz_node();
907
+ if (subchannel_node != nullptr) {
908
+ auto it = chand_->subchannel_refcount_map_.find(subchannel_);
909
+ if (it == chand_->subchannel_refcount_map_.end()) {
910
+ chand_->channelz_node_->AddChildSubchannel(subchannel_node->uuid());
911
+ it = chand_->subchannel_refcount_map_.emplace(subchannel_, 0).first;
912
+ }
913
+ ++it->second;
914
+ }
915
+ chand_->subchannel_wrappers_.insert(this);
726
916
  }
727
917
 
728
- private:
729
- static const char* GetChannelConnectivityStateChangeString(
730
- grpc_connectivity_state state) {
731
- switch (state) {
732
- case GRPC_CHANNEL_IDLE:
733
- return "Channel state change to IDLE";
734
- case GRPC_CHANNEL_CONNECTING:
735
- return "Channel state change to CONNECTING";
736
- case GRPC_CHANNEL_READY:
737
- return "Channel state change to READY";
738
- case GRPC_CHANNEL_TRANSIENT_FAILURE:
739
- return "Channel state change to TRANSIENT_FAILURE";
740
- case GRPC_CHANNEL_SHUTDOWN:
741
- return "Channel state change to SHUTDOWN";
742
- }
743
- GPR_UNREACHABLE_CODE(return "UNKNOWN");
744
- }
745
-
746
- static void SetPicker(void* arg, grpc_error* ignored) {
747
- auto* self = static_cast<ConnectivityStateAndPickerSetter*>(arg);
748
- // Update picker.
749
- self->chand_->picker_ = std::move(self->picker_);
750
- // Re-process queued picks.
751
- for (QueuedPick* pick = self->chand_->queued_picks_; pick != nullptr;
752
- pick = pick->next) {
753
- CallData::StartPickLocked(pick->elem, GRPC_ERROR_NONE);
918
+ ~SubchannelWrapper() {
919
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
920
+ gpr_log(GPR_INFO,
921
+ "chand=%p: destroying subchannel wrapper %p for subchannel %p",
922
+ chand_, this, subchannel_);
923
+ }
924
+ chand_->subchannel_wrappers_.erase(this);
925
+ auto* subchannel_node = subchannel_->channelz_node();
926
+ if (subchannel_node != nullptr) {
927
+ auto it = chand_->subchannel_refcount_map_.find(subchannel_);
928
+ GPR_ASSERT(it != chand_->subchannel_refcount_map_.end());
929
+ --it->second;
930
+ if (it->second == 0) {
931
+ chand_->channelz_node_->RemoveChildSubchannel(subchannel_node->uuid());
932
+ chand_->subchannel_refcount_map_.erase(it);
933
+ }
754
934
  }
755
- // Clean up.
756
- GRPC_CHANNEL_STACK_UNREF(self->chand_->owning_stack_,
757
- "ConnectivityStateAndPickerSetter");
758
- Delete(self);
935
+ GRPC_SUBCHANNEL_UNREF(subchannel_, "unref from LB");
936
+ GRPC_CHANNEL_STACK_UNREF(chand_->owning_stack_, "SubchannelWrapper");
759
937
  }
760
938
 
761
- ChannelData* chand_;
762
- UniquePtr<LoadBalancingPolicy::SubchannelPicker> picker_;
763
- grpc_closure closure_;
764
- };
765
-
766
- //
767
- // ChannelData::ServiceConfigSetter
768
- //
939
+ grpc_connectivity_state CheckConnectivityState() override {
940
+ RefCountedPtr<ConnectedSubchannel> connected_subchannel;
941
+ grpc_connectivity_state connectivity_state =
942
+ subchannel_->CheckConnectivityState(health_check_service_name_.get(),
943
+ &connected_subchannel);
944
+ MaybeUpdateConnectedSubchannel(std::move(connected_subchannel));
945
+ return connectivity_state;
946
+ }
769
947
 
770
- // A fire-and-forget class that sets the channel's service config data
771
- // in the data plane combiner. Deletes itself when done.
772
- class ChannelData::ServiceConfigSetter {
773
- public:
774
- ServiceConfigSetter(
775
- ChannelData* chand,
776
- Optional<internal::ClientChannelGlobalParsedObject::RetryThrottling>
777
- retry_throttle_data,
778
- RefCountedPtr<ServiceConfig> service_config)
779
- : chand_(chand),
780
- retry_throttle_data_(retry_throttle_data),
781
- service_config_(std::move(service_config)) {
782
- GRPC_CHANNEL_STACK_REF(chand->owning_stack_, "ServiceConfigSetter");
783
- GRPC_CLOSURE_INIT(&closure_, SetServiceConfigData, this,
784
- grpc_combiner_scheduler(chand->data_plane_combiner_));
785
- GRPC_CLOSURE_SCHED(&closure_, GRPC_ERROR_NONE);
948
+ void WatchConnectivityState(
949
+ grpc_connectivity_state initial_state,
950
+ std::unique_ptr<ConnectivityStateWatcherInterface> watcher) override {
951
+ auto& watcher_wrapper = watcher_map_[watcher.get()];
952
+ GPR_ASSERT(watcher_wrapper == nullptr);
953
+ watcher_wrapper = new WatcherWrapper(std::move(watcher),
954
+ Ref(DEBUG_LOCATION, "WatcherWrapper"),
955
+ initial_state);
956
+ subchannel_->WatchConnectivityState(
957
+ initial_state,
958
+ grpc_core::UniquePtr<char>(
959
+ gpr_strdup(health_check_service_name_.get())),
960
+ RefCountedPtr<Subchannel::ConnectivityStateWatcherInterface>(
961
+ watcher_wrapper));
786
962
  }
787
963
 
788
- private:
789
- static void SetServiceConfigData(void* arg, grpc_error* ignored) {
790
- ServiceConfigSetter* self = static_cast<ServiceConfigSetter*>(arg);
791
- ChannelData* chand = self->chand_;
792
- // Update channel state.
793
- chand->received_service_config_data_ = true;
794
- if (self->retry_throttle_data_.has_value()) {
795
- chand->retry_throttle_data_ =
796
- internal::ServerRetryThrottleMap::GetDataForServer(
797
- chand->server_name_.get(),
798
- self->retry_throttle_data_.value().max_milli_tokens,
799
- self->retry_throttle_data_.value().milli_token_ratio);
800
- }
801
- chand->service_config_ = std::move(self->service_config_);
802
- // Apply service config to queued picks.
803
- for (QueuedPick* pick = chand->queued_picks_; pick != nullptr;
804
- pick = pick->next) {
805
- CallData* calld = static_cast<CallData*>(pick->elem->call_data);
806
- calld->MaybeApplyServiceConfigToCallLocked(pick->elem);
807
- }
808
- // Clean up.
809
- GRPC_CHANNEL_STACK_UNREF(self->chand_->owning_stack_,
810
- "ServiceConfigSetter");
811
- Delete(self);
964
+ void CancelConnectivityStateWatch(
965
+ ConnectivityStateWatcherInterface* watcher) override {
966
+ auto it = watcher_map_.find(watcher);
967
+ GPR_ASSERT(it != watcher_map_.end());
968
+ subchannel_->CancelConnectivityStateWatch(health_check_service_name_.get(),
969
+ it->second);
970
+ watcher_map_.erase(it);
812
971
  }
813
972
 
814
- ChannelData* chand_;
815
- Optional<internal::ClientChannelGlobalParsedObject::RetryThrottling>
816
- retry_throttle_data_;
817
- RefCountedPtr<ServiceConfig> service_config_;
818
- grpc_closure closure_;
819
- };
973
+ void AttemptToConnect() override { subchannel_->AttemptToConnect(); }
820
974
 
821
- //
822
- // ChannelData::ExternalConnectivityWatcher::WatcherList
823
- //
975
+ void ResetBackoff() override { subchannel_->ResetBackoff(); }
824
976
 
825
- int ChannelData::ExternalConnectivityWatcher::WatcherList::size() const {
826
- MutexLock lock(&mu_);
827
- int count = 0;
828
- for (ExternalConnectivityWatcher* w = head_; w != nullptr; w = w->next_) {
829
- ++count;
977
+ void ThrottleKeepaliveTime(int new_keepalive_time) {
978
+ subchannel_->ThrottleKeepaliveTime(new_keepalive_time);
830
979
  }
831
- return count;
832
- }
833
980
 
834
- ChannelData::ExternalConnectivityWatcher*
835
- ChannelData::ExternalConnectivityWatcher::WatcherList::Lookup(
836
- grpc_closure* on_complete) const {
837
- MutexLock lock(&mu_);
838
- ExternalConnectivityWatcher* w = head_;
839
- while (w != nullptr && w->on_complete_ != on_complete) {
840
- w = w->next_;
981
+ const grpc_channel_args* channel_args() override {
982
+ return subchannel_->channel_args();
841
983
  }
842
- return w;
843
- }
844
984
 
845
- void ChannelData::ExternalConnectivityWatcher::WatcherList::Add(
846
- ExternalConnectivityWatcher* watcher) {
847
- GPR_ASSERT(Lookup(watcher->on_complete_) == nullptr);
848
- MutexLock lock(&mu_);
849
- GPR_ASSERT(watcher->next_ == nullptr);
850
- watcher->next_ = head_;
851
- head_ = watcher;
852
- }
985
+ void UpdateHealthCheckServiceName(
986
+ grpc_core::UniquePtr<char> health_check_service_name) {
987
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
988
+ gpr_log(GPR_INFO,
989
+ "chand=%p: subchannel wrapper %p: updating health check service "
990
+ "name from \"%s\" to \"%s\"",
991
+ chand_, this, health_check_service_name_.get(),
992
+ health_check_service_name.get());
993
+ }
994
+ for (auto& p : watcher_map_) {
995
+ WatcherWrapper*& watcher_wrapper = p.second;
996
+ // Cancel the current watcher and create a new one using the new
997
+ // health check service name.
998
+ // TODO(roth): If there is not already an existing health watch
999
+ // call for the new name, then the watcher will initially report
1000
+ // state CONNECTING. If the LB policy is currently reporting
1001
+ // state READY, this may cause it to switch to CONNECTING before
1002
+ // switching back to READY. This could cause a small delay for
1003
+ // RPCs being started on the channel. If/when this becomes a
1004
+ // problem, we may be able to handle it by waiting for the new
1005
+ // watcher to report READY before we use it to replace the old one.
1006
+ WatcherWrapper* replacement = watcher_wrapper->MakeReplacement();
1007
+ subchannel_->CancelConnectivityStateWatch(
1008
+ health_check_service_name_.get(), watcher_wrapper);
1009
+ watcher_wrapper = replacement;
1010
+ subchannel_->WatchConnectivityState(
1011
+ replacement->last_seen_state(),
1012
+ grpc_core::UniquePtr<char>(
1013
+ gpr_strdup(health_check_service_name.get())),
1014
+ RefCountedPtr<Subchannel::ConnectivityStateWatcherInterface>(
1015
+ replacement));
1016
+ }
1017
+ // Save the new health check service name.
1018
+ health_check_service_name_ = std::move(health_check_service_name);
1019
+ }
853
1020
 
854
- void ChannelData::ExternalConnectivityWatcher::WatcherList::Remove(
855
- const ExternalConnectivityWatcher* watcher) {
856
- MutexLock lock(&mu_);
857
- if (watcher == head_) {
858
- head_ = watcher->next_;
859
- return;
1021
+ // Caller must be holding the control-plane work_serializer.
1022
+ ConnectedSubchannel* connected_subchannel() const {
1023
+ return connected_subchannel_.get();
860
1024
  }
861
- for (ExternalConnectivityWatcher* w = head_; w != nullptr; w = w->next_) {
862
- if (w->next_ == watcher) {
863
- w->next_ = w->next_->next_;
864
- return;
1025
+
1026
+ // Caller must be holding the data-plane mutex.
1027
+ ConnectedSubchannel* connected_subchannel_in_data_plane() const {
1028
+ return connected_subchannel_in_data_plane_.get();
1029
+ }
1030
+ void set_connected_subchannel_in_data_plane(
1031
+ RefCountedPtr<ConnectedSubchannel> connected_subchannel) {
1032
+ connected_subchannel_in_data_plane_ = std::move(connected_subchannel);
1033
+ }
1034
+
1035
+ private:
1036
+ // Subchannel and SubchannelInterface have different interfaces for
1037
+ // their respective ConnectivityStateWatcherInterface classes.
1038
+ // The one in Subchannel updates the ConnectedSubchannel along with
1039
+ // the state, whereas the one in SubchannelInterface does not expose
1040
+ // the ConnectedSubchannel.
1041
+ //
1042
+ // This wrapper provides a bridge between the two. It implements
1043
+ // Subchannel::ConnectivityStateWatcherInterface and wraps
1044
+ // the instance of SubchannelInterface::ConnectivityStateWatcherInterface
1045
+ // that was passed in by the LB policy. We pass an instance of this
1046
+ // class to the underlying Subchannel, and when we get updates from
1047
+ // the subchannel, we pass those on to the wrapped watcher to return
1048
+ // the update to the LB policy. This allows us to set the connected
1049
+ // subchannel before passing the result back to the LB policy.
1050
+ class WatcherWrapper : public Subchannel::ConnectivityStateWatcherInterface {
1051
+ public:
1052
+ WatcherWrapper(
1053
+ std::unique_ptr<SubchannelInterface::ConnectivityStateWatcherInterface>
1054
+ watcher,
1055
+ RefCountedPtr<SubchannelWrapper> parent,
1056
+ grpc_connectivity_state initial_state)
1057
+ : watcher_(std::move(watcher)),
1058
+ parent_(std::move(parent)),
1059
+ last_seen_state_(initial_state) {}
1060
+
1061
+ ~WatcherWrapper() {
1062
+ auto* parent = parent_.release(); // ref owned by lambda
1063
+ parent->chand_->work_serializer_->Run(
1064
+ [parent]() { parent->Unref(DEBUG_LOCATION, "WatcherWrapper"); },
1065
+ DEBUG_LOCATION);
1066
+ }
1067
+
1068
+ void OnConnectivityStateChange() override {
1069
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
1070
+ gpr_log(GPR_INFO,
1071
+ "chand=%p: connectivity change for subchannel wrapper %p "
1072
+ "subchannel %p; hopping into work_serializer",
1073
+ parent_->chand_, parent_.get(), parent_->subchannel_);
1074
+ }
1075
+ Ref().release(); // ref owned by lambda
1076
+ parent_->chand_->work_serializer_->Run(
1077
+ [this]() {
1078
+ ApplyUpdateInControlPlaneWorkSerializer();
1079
+ Unref();
1080
+ },
1081
+ DEBUG_LOCATION);
1082
+ }
1083
+
1084
+ grpc_pollset_set* interested_parties() override {
1085
+ SubchannelInterface::ConnectivityStateWatcherInterface* watcher =
1086
+ watcher_.get();
1087
+ if (watcher_ == nullptr) watcher = replacement_->watcher_.get();
1088
+ return watcher->interested_parties();
1089
+ }
1090
+
1091
+ WatcherWrapper* MakeReplacement() {
1092
+ auto* replacement =
1093
+ new WatcherWrapper(std::move(watcher_), parent_, last_seen_state_);
1094
+ replacement_ = replacement;
1095
+ return replacement;
1096
+ }
1097
+
1098
+ grpc_connectivity_state last_seen_state() const { return last_seen_state_; }
1099
+
1100
+ private:
1101
+ void ApplyUpdateInControlPlaneWorkSerializer() {
1102
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
1103
+ gpr_log(GPR_INFO,
1104
+ "chand=%p: processing connectivity change in work serializer "
1105
+ "for subchannel wrapper %p subchannel %p "
1106
+ "watcher=%p",
1107
+ parent_->chand_, parent_.get(), parent_->subchannel_,
1108
+ watcher_.get());
1109
+ }
1110
+ ConnectivityStateChange state_change = PopConnectivityStateChange();
1111
+ absl::optional<absl::Cord> keepalive_throttling =
1112
+ state_change.status.GetPayload(grpc_core::kKeepaliveThrottlingKey);
1113
+ if (keepalive_throttling.has_value()) {
1114
+ int new_keepalive_time = -1;
1115
+ if (absl::SimpleAtoi(std::string(keepalive_throttling.value()),
1116
+ &new_keepalive_time)) {
1117
+ if (new_keepalive_time > parent_->chand_->keepalive_time_) {
1118
+ parent_->chand_->keepalive_time_ = new_keepalive_time;
1119
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
1120
+ gpr_log(GPR_INFO, "chand=%p: throttling keepalive time to %d",
1121
+ parent_->chand_, parent_->chand_->keepalive_time_);
1122
+ }
1123
+ // Propagate the new keepalive time to all subchannels. This is so
1124
+ // that new transports created by any subchannel (and not just the
1125
+ // subchannel that received the GOAWAY), use the new keepalive time.
1126
+ for (auto* subchannel_wrapper :
1127
+ parent_->chand_->subchannel_wrappers_) {
1128
+ subchannel_wrapper->ThrottleKeepaliveTime(new_keepalive_time);
1129
+ }
1130
+ }
1131
+ } else {
1132
+ gpr_log(GPR_ERROR, "chand=%p: Illegal keepalive throttling value %s",
1133
+ parent_->chand_,
1134
+ std::string(keepalive_throttling.value()).c_str());
1135
+ }
1136
+ }
1137
+ // Ignore update if the parent WatcherWrapper has been replaced
1138
+ // since this callback was scheduled.
1139
+ if (watcher_ != nullptr) {
1140
+ last_seen_state_ = state_change.state;
1141
+ parent_->MaybeUpdateConnectedSubchannel(
1142
+ std::move(state_change.connected_subchannel));
1143
+ watcher_->OnConnectivityStateChange(state_change.state);
1144
+ }
1145
+ }
1146
+
1147
+ std::unique_ptr<SubchannelInterface::ConnectivityStateWatcherInterface>
1148
+ watcher_;
1149
+ RefCountedPtr<SubchannelWrapper> parent_;
1150
+ grpc_connectivity_state last_seen_state_;
1151
+ WatcherWrapper* replacement_ = nullptr;
1152
+ };
1153
+
1154
+ void MaybeUpdateConnectedSubchannel(
1155
+ RefCountedPtr<ConnectedSubchannel> connected_subchannel) {
1156
+ // Update the connected subchannel only if the channel is not shutting
1157
+ // down. This is because once the channel is shutting down, we
1158
+ // ignore picker updates from the LB policy, which means that
1159
+ // UpdateStateAndPickerLocked() will never process the entries
1160
+ // in chand_->pending_subchannel_updates_. So we don't want to add
1161
+ // entries there that will never be processed, since that would
1162
+ // leave dangling refs to the channel and prevent its destruction.
1163
+ grpc_error* disconnect_error = chand_->disconnect_error();
1164
+ if (disconnect_error != GRPC_ERROR_NONE) return;
1165
+ // Not shutting down, so do the update.
1166
+ if (connected_subchannel_ != connected_subchannel) {
1167
+ connected_subchannel_ = std::move(connected_subchannel);
1168
+ // Record the new connected subchannel so that it can be updated
1169
+ // in the data plane mutex the next time the picker is updated.
1170
+ chand_->pending_subchannel_updates_[Ref(
1171
+ DEBUG_LOCATION, "ConnectedSubchannelUpdate")] = connected_subchannel_;
865
1172
  }
866
1173
  }
867
- GPR_UNREACHABLE_CODE(return );
868
- }
1174
+
1175
+ ChannelData* chand_;
1176
+ Subchannel* subchannel_;
1177
+ grpc_core::UniquePtr<char> health_check_service_name_;
1178
+ // Maps from the address of the watcher passed to us by the LB policy
1179
+ // to the address of the WrapperWatcher that we passed to the underlying
1180
+ // subchannel. This is needed so that when the LB policy calls
1181
+ // CancelConnectivityStateWatch() with its watcher, we know the
1182
+ // corresponding WrapperWatcher to cancel on the underlying subchannel.
1183
+ std::map<ConnectivityStateWatcherInterface*, WatcherWrapper*> watcher_map_;
1184
+ // To be accessed only in the control plane work_serializer.
1185
+ RefCountedPtr<ConnectedSubchannel> connected_subchannel_;
1186
+ // To be accessed only in the data plane mutex.
1187
+ RefCountedPtr<ConnectedSubchannel> connected_subchannel_in_data_plane_;
1188
+ };
869
1189
 
870
1190
  //
871
1191
  // ChannelData::ExternalConnectivityWatcher
@@ -877,16 +1197,28 @@ ChannelData::ExternalConnectivityWatcher::ExternalConnectivityWatcher(
877
1197
  grpc_closure* watcher_timer_init)
878
1198
  : chand_(chand),
879
1199
  pollent_(pollent),
1200
+ initial_state_(*state),
880
1201
  state_(state),
881
1202
  on_complete_(on_complete),
882
1203
  watcher_timer_init_(watcher_timer_init) {
883
1204
  grpc_polling_entity_add_to_pollset_set(&pollent_,
884
1205
  chand_->interested_parties_);
885
1206
  GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "ExternalConnectivityWatcher");
886
- GRPC_CLOSURE_SCHED(
887
- GRPC_CLOSURE_INIT(&my_closure_, WatchConnectivityStateLocked, this,
888
- grpc_combiner_scheduler(chand_->combiner_)),
889
- GRPC_ERROR_NONE);
1207
+ {
1208
+ MutexLock lock(&chand_->external_watchers_mu_);
1209
+ // Will be deleted when the watch is complete.
1210
+ GPR_ASSERT(chand->external_watchers_[on_complete] == nullptr);
1211
+ // Store a ref to the watcher in the external_watchers_ map.
1212
+ chand->external_watchers_[on_complete] =
1213
+ Ref(DEBUG_LOCATION, "AddWatcherToExternalWatchersMapLocked");
1214
+ }
1215
+ // Pass the ref from creating the object to Start().
1216
+ chand_->work_serializer_->Run(
1217
+ [this]() {
1218
+ // The ref is passed to AddWatcherLocked().
1219
+ AddWatcherLocked();
1220
+ },
1221
+ DEBUG_LOCATION);
890
1222
  }
891
1223
 
892
1224
  ChannelData::ExternalConnectivityWatcher::~ExternalConnectivityWatcher() {
@@ -896,44 +1228,123 @@ ChannelData::ExternalConnectivityWatcher::~ExternalConnectivityWatcher() {
896
1228
  "ExternalConnectivityWatcher");
897
1229
  }
898
1230
 
899
- void ChannelData::ExternalConnectivityWatcher::OnWatchCompleteLocked(
900
- void* arg, grpc_error* error) {
901
- ExternalConnectivityWatcher* self =
902
- static_cast<ExternalConnectivityWatcher*>(arg);
903
- grpc_closure* on_complete = self->on_complete_;
904
- self->chand_->external_connectivity_watcher_list_.Remove(self);
905
- Delete(self);
906
- GRPC_CLOSURE_SCHED(on_complete, GRPC_ERROR_REF(error));
907
- }
908
-
909
- void ChannelData::ExternalConnectivityWatcher::WatchConnectivityStateLocked(
910
- void* arg, grpc_error* ignored) {
911
- ExternalConnectivityWatcher* self =
912
- static_cast<ExternalConnectivityWatcher*>(arg);
913
- if (self->state_ == nullptr) {
914
- // Handle cancellation.
915
- GPR_ASSERT(self->watcher_timer_init_ == nullptr);
916
- ExternalConnectivityWatcher* found =
917
- self->chand_->external_connectivity_watcher_list_.Lookup(
918
- self->on_complete_);
919
- if (found != nullptr) {
920
- grpc_connectivity_state_notify_on_state_change(
921
- &found->chand_->state_tracker_, nullptr, &found->my_closure_);
922
- }
923
- Delete(self);
924
- return;
1231
+ void ChannelData::ExternalConnectivityWatcher::
1232
+ RemoveWatcherFromExternalWatchersMap(ChannelData* chand,
1233
+ grpc_closure* on_complete,
1234
+ bool cancel) {
1235
+ RefCountedPtr<ExternalConnectivityWatcher> watcher;
1236
+ {
1237
+ MutexLock lock(&chand->external_watchers_mu_);
1238
+ auto it = chand->external_watchers_.find(on_complete);
1239
+ if (it != chand->external_watchers_.end()) {
1240
+ watcher = std::move(it->second);
1241
+ chand->external_watchers_.erase(it);
1242
+ }
925
1243
  }
926
- // New watcher.
927
- self->chand_->external_connectivity_watcher_list_.Add(self);
928
- // This assumes that the closure is scheduled on the ExecCtx scheduler
929
- // and that GRPC_CLOSURE_RUN would run the closure immediately.
930
- GRPC_CLOSURE_RUN(self->watcher_timer_init_, GRPC_ERROR_NONE);
931
- GRPC_CLOSURE_INIT(&self->my_closure_, OnWatchCompleteLocked, self,
932
- grpc_combiner_scheduler(self->chand_->combiner_));
933
- grpc_connectivity_state_notify_on_state_change(
934
- &self->chand_->state_tracker_, self->state_, &self->my_closure_);
1244
+ // watcher->Cancel() will hop into the WorkSerializer, so we have to unlock
1245
+ // the mutex before calling it.
1246
+ if (watcher != nullptr && cancel) watcher->Cancel();
935
1247
  }
936
1248
 
1249
+ void ChannelData::ExternalConnectivityWatcher::Notify(
1250
+ grpc_connectivity_state state, const absl::Status& /* status */) {
1251
+ bool done = false;
1252
+ if (!done_.CompareExchangeStrong(&done, true, MemoryOrder::RELAXED,
1253
+ MemoryOrder::RELAXED)) {
1254
+ return; // Already done.
1255
+ }
1256
+ // Remove external watcher.
1257
+ chand_->RemoveExternalConnectivityWatcher(on_complete_, /*cancel=*/false);
1258
+ // Report new state to the user.
1259
+ *state_ = state;
1260
+ ExecCtx::Run(DEBUG_LOCATION, on_complete_, GRPC_ERROR_NONE);
1261
+ // Hop back into the work_serializer to clean up.
1262
+ // Not needed in state SHUTDOWN, because the tracker will
1263
+ // automatically remove all watchers in that case.
1264
+ if (state != GRPC_CHANNEL_SHUTDOWN) {
1265
+ chand_->work_serializer_->Run([this]() { RemoveWatcherLocked(); },
1266
+ DEBUG_LOCATION);
1267
+ }
1268
+ }
1269
+
1270
+ void ChannelData::ExternalConnectivityWatcher::Cancel() {
1271
+ bool done = false;
1272
+ if (!done_.CompareExchangeStrong(&done, true, MemoryOrder::RELAXED,
1273
+ MemoryOrder::RELAXED)) {
1274
+ return; // Already done.
1275
+ }
1276
+ ExecCtx::Run(DEBUG_LOCATION, on_complete_, GRPC_ERROR_CANCELLED);
1277
+ // Hop back into the work_serializer to clean up.
1278
+ chand_->work_serializer_->Run([this]() { RemoveWatcherLocked(); },
1279
+ DEBUG_LOCATION);
1280
+ }
1281
+
1282
+ void ChannelData::ExternalConnectivityWatcher::AddWatcherLocked() {
1283
+ Closure::Run(DEBUG_LOCATION, watcher_timer_init_, GRPC_ERROR_NONE);
1284
+ // Add new watcher. Pass the ref of the object from creation to OrphanablePtr.
1285
+ chand_->state_tracker_.AddWatcher(
1286
+ initial_state_, OrphanablePtr<ConnectivityStateWatcherInterface>(this));
1287
+ }
1288
+
1289
+ void ChannelData::ExternalConnectivityWatcher::RemoveWatcherLocked() {
1290
+ chand_->state_tracker_.RemoveWatcher(this);
1291
+ }
1292
+
1293
+ //
1294
+ // ChannelData::ConnectivityWatcherAdder
1295
+ //
1296
+
1297
+ class ChannelData::ConnectivityWatcherAdder {
1298
+ public:
1299
+ ConnectivityWatcherAdder(
1300
+ ChannelData* chand, grpc_connectivity_state initial_state,
1301
+ OrphanablePtr<AsyncConnectivityStateWatcherInterface> watcher)
1302
+ : chand_(chand),
1303
+ initial_state_(initial_state),
1304
+ watcher_(std::move(watcher)) {
1305
+ GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "ConnectivityWatcherAdder");
1306
+ chand_->work_serializer_->Run([this]() { AddWatcherLocked(); },
1307
+ DEBUG_LOCATION);
1308
+ }
1309
+
1310
+ private:
1311
+ void AddWatcherLocked() {
1312
+ chand_->state_tracker_.AddWatcher(initial_state_, std::move(watcher_));
1313
+ GRPC_CHANNEL_STACK_UNREF(chand_->owning_stack_, "ConnectivityWatcherAdder");
1314
+ delete this;
1315
+ }
1316
+
1317
+ ChannelData* chand_;
1318
+ grpc_connectivity_state initial_state_;
1319
+ OrphanablePtr<AsyncConnectivityStateWatcherInterface> watcher_;
1320
+ };
1321
+
1322
+ //
1323
+ // ChannelData::ConnectivityWatcherRemover
1324
+ //
1325
+
1326
+ class ChannelData::ConnectivityWatcherRemover {
1327
+ public:
1328
+ ConnectivityWatcherRemover(ChannelData* chand,
1329
+ AsyncConnectivityStateWatcherInterface* watcher)
1330
+ : chand_(chand), watcher_(watcher) {
1331
+ GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "ConnectivityWatcherRemover");
1332
+ chand_->work_serializer_->Run([this]() { RemoveWatcherLocked(); },
1333
+ DEBUG_LOCATION);
1334
+ }
1335
+
1336
+ private:
1337
+ void RemoveWatcherLocked() {
1338
+ chand_->state_tracker_.RemoveWatcher(watcher_);
1339
+ GRPC_CHANNEL_STACK_UNREF(chand_->owning_stack_,
1340
+ "ConnectivityWatcherRemover");
1341
+ delete this;
1342
+ }
1343
+
1344
+ ChannelData* chand_;
1345
+ AsyncConnectivityStateWatcherInterface* watcher_;
1346
+ };
1347
+
937
1348
  //
938
1349
  // ChannelData::ClientChannelControlHelper
939
1350
  //
@@ -950,57 +1361,248 @@ class ChannelData::ClientChannelControlHelper
950
1361
  "ClientChannelControlHelper");
951
1362
  }
952
1363
 
953
- Subchannel* CreateSubchannel(const grpc_channel_args& args) override {
954
- grpc_arg args_to_add[2];
955
- int num_args_to_add = 0;
956
- if (chand_->health_check_service_name_ != nullptr) {
957
- args_to_add[0] = grpc_channel_arg_string_create(
958
- const_cast<char*>("grpc.temp.health_check"),
959
- const_cast<char*>(chand_->health_check_service_name_.get()));
960
- num_args_to_add++;
1364
+ RefCountedPtr<SubchannelInterface> CreateSubchannel(
1365
+ const grpc_channel_args& args) override {
1366
+ bool inhibit_health_checking = grpc_channel_arg_get_bool(
1367
+ grpc_channel_args_find(&args, GRPC_ARG_INHIBIT_HEALTH_CHECKING), false);
1368
+ grpc_core::UniquePtr<char> health_check_service_name;
1369
+ if (!inhibit_health_checking) {
1370
+ health_check_service_name.reset(
1371
+ gpr_strdup(chand_->health_check_service_name_.get()));
961
1372
  }
962
- args_to_add[num_args_to_add++] = SubchannelPoolInterface::CreateChannelArg(
1373
+ static const char* args_to_remove[] = {
1374
+ GRPC_ARG_INHIBIT_HEALTH_CHECKING,
1375
+ GRPC_ARG_CHANNELZ_CHANNEL_NODE,
1376
+ };
1377
+ grpc_arg arg = SubchannelPoolInterface::CreateChannelArg(
963
1378
  chand_->subchannel_pool_.get());
964
- grpc_channel_args* new_args =
965
- grpc_channel_args_copy_and_add(&args, args_to_add, num_args_to_add);
1379
+ grpc_channel_args* new_args = grpc_channel_args_copy_and_add_and_remove(
1380
+ &args, args_to_remove, GPR_ARRAY_SIZE(args_to_remove), &arg, 1);
966
1381
  Subchannel* subchannel =
967
1382
  chand_->client_channel_factory_->CreateSubchannel(new_args);
968
1383
  grpc_channel_args_destroy(new_args);
969
- return subchannel;
970
- }
971
-
972
- grpc_channel* CreateChannel(const char* target,
973
- const grpc_channel_args& args) override {
974
- return chand_->client_channel_factory_->CreateChannel(target, &args);
1384
+ if (subchannel == nullptr) return nullptr;
1385
+ subchannel->ThrottleKeepaliveTime(chand_->keepalive_time_);
1386
+ return MakeRefCounted<SubchannelWrapper>(
1387
+ chand_, subchannel, std::move(health_check_service_name));
975
1388
  }
976
1389
 
977
1390
  void UpdateState(
978
- grpc_connectivity_state state,
979
- UniquePtr<LoadBalancingPolicy::SubchannelPicker> picker) override {
980
- grpc_error* disconnect_error =
981
- chand_->disconnect_error_.Load(MemoryOrder::ACQUIRE);
1391
+ grpc_connectivity_state state, const absl::Status& status,
1392
+ std::unique_ptr<LoadBalancingPolicy::SubchannelPicker> picker) override {
1393
+ grpc_error* disconnect_error = chand_->disconnect_error();
982
1394
  if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
983
1395
  const char* extra = disconnect_error == GRPC_ERROR_NONE
984
1396
  ? ""
985
1397
  : " (ignoring -- channel shutting down)";
986
- gpr_log(GPR_INFO, "chand=%p: update: state=%s picker=%p%s", chand_,
987
- grpc_connectivity_state_name(state), picker.get(), extra);
1398
+ gpr_log(GPR_INFO, "chand=%p: update: state=%s status=(%s) picker=%p%s",
1399
+ chand_, ConnectivityStateName(state), status.ToString().c_str(),
1400
+ picker.get(), extra);
988
1401
  }
989
1402
  // Do update only if not shutting down.
990
1403
  if (disconnect_error == GRPC_ERROR_NONE) {
991
- // Will delete itself.
992
- New<ConnectivityStateAndPickerSetter>(chand_, state, "helper",
993
- std::move(picker));
1404
+ chand_->UpdateStateAndPickerLocked(state, status, "helper",
1405
+ std::move(picker));
994
1406
  }
995
1407
  }
996
1408
 
997
1409
  // No-op -- we should never get this from ResolvingLoadBalancingPolicy.
998
1410
  void RequestReresolution() override {}
999
1411
 
1412
+ void AddTraceEvent(TraceSeverity severity,
1413
+ absl::string_view message) override {
1414
+ if (chand_->channelz_node_ != nullptr) {
1415
+ chand_->channelz_node_->AddTraceEvent(
1416
+ ConvertSeverityEnum(severity),
1417
+ grpc_slice_from_copied_buffer(message.data(), message.size()));
1418
+ }
1419
+ }
1420
+
1000
1421
  private:
1422
+ static channelz::ChannelTrace::Severity ConvertSeverityEnum(
1423
+ TraceSeverity severity) {
1424
+ if (severity == TRACE_INFO) return channelz::ChannelTrace::Info;
1425
+ if (severity == TRACE_WARNING) return channelz::ChannelTrace::Warning;
1426
+ return channelz::ChannelTrace::Error;
1427
+ }
1428
+
1001
1429
  ChannelData* chand_;
1002
1430
  };
1003
1431
 
1432
+ //
1433
+ // ChannelData::ChannelConfigHelper
1434
+ //
1435
+
1436
+ // Synchronous callback from ResolvingLoadBalancingPolicy to process a
1437
+ // resolver result update.
1438
+ ChannelData::ChannelConfigHelper::ApplyServiceConfigResult
1439
+ ChannelData::ChannelConfigHelper::ApplyServiceConfig(
1440
+ const Resolver::Result& result) {
1441
+ ApplyServiceConfigResult service_config_result;
1442
+ RefCountedPtr<ServiceConfig> service_config;
1443
+ // If resolver did not return a service config or returned an invalid service
1444
+ // config, we need a fallback service config.
1445
+ if (result.service_config_error != GRPC_ERROR_NONE) {
1446
+ // If the service config was invalid, then fallback to the saved service
1447
+ // config. If there is no saved config either, use the default service
1448
+ // config.
1449
+ if (chand_->saved_service_config_ != nullptr) {
1450
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
1451
+ gpr_log(GPR_INFO,
1452
+ "chand=%p: resolver returned invalid service config. "
1453
+ "Continuing to use previous service config.",
1454
+ chand_);
1455
+ }
1456
+ service_config = chand_->saved_service_config_;
1457
+ } else if (chand_->default_service_config_ != nullptr) {
1458
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
1459
+ gpr_log(GPR_INFO,
1460
+ "chand=%p: resolver returned invalid service config. Using "
1461
+ "default service config provided by client API.",
1462
+ chand_);
1463
+ }
1464
+ service_config = chand_->default_service_config_;
1465
+ }
1466
+ } else if (result.service_config == nullptr) {
1467
+ if (chand_->default_service_config_ != nullptr) {
1468
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
1469
+ gpr_log(GPR_INFO,
1470
+ "chand=%p: resolver returned no service config. Using default "
1471
+ "service config provided by client API.",
1472
+ chand_);
1473
+ }
1474
+ service_config = chand_->default_service_config_;
1475
+ }
1476
+ } else {
1477
+ service_config = result.service_config;
1478
+ }
1479
+ service_config_result.service_config_error =
1480
+ GRPC_ERROR_REF(result.service_config_error);
1481
+ if (service_config == nullptr &&
1482
+ result.service_config_error != GRPC_ERROR_NONE) {
1483
+ service_config_result.no_valid_service_config = true;
1484
+ return service_config_result;
1485
+ }
1486
+ // Process service config.
1487
+ grpc_core::UniquePtr<char> service_config_json;
1488
+ const internal::ClientChannelGlobalParsedConfig* parsed_service_config =
1489
+ nullptr;
1490
+ if (service_config != nullptr) {
1491
+ parsed_service_config =
1492
+ static_cast<const internal::ClientChannelGlobalParsedConfig*>(
1493
+ service_config->GetGlobalParsedConfig(
1494
+ internal::ClientChannelServiceConfigParser::ParserIndex()));
1495
+ }
1496
+ // Check if the config has changed.
1497
+ service_config_result.service_config_changed =
1498
+ ((service_config == nullptr) !=
1499
+ (chand_->saved_service_config_ == nullptr)) ||
1500
+ (service_config != nullptr &&
1501
+ service_config->json_string() !=
1502
+ chand_->saved_service_config_->json_string());
1503
+ if (service_config_result.service_config_changed) {
1504
+ service_config_json.reset(gpr_strdup(
1505
+ service_config != nullptr ? service_config->json_string().c_str()
1506
+ : ""));
1507
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
1508
+ gpr_log(GPR_INFO,
1509
+ "chand=%p: resolver returned updated service config: \"%s\"",
1510
+ chand_, service_config_json.get());
1511
+ }
1512
+ // Save health check service name.
1513
+ if (service_config != nullptr) {
1514
+ chand_->health_check_service_name_.reset(
1515
+ gpr_strdup(parsed_service_config->health_check_service_name()));
1516
+ } else {
1517
+ chand_->health_check_service_name_.reset();
1518
+ }
1519
+ // Update health check service name used by existing subchannel wrappers.
1520
+ for (auto* subchannel_wrapper : chand_->subchannel_wrappers_) {
1521
+ subchannel_wrapper->UpdateHealthCheckServiceName(
1522
+ grpc_core::UniquePtr<char>(
1523
+ gpr_strdup(chand_->health_check_service_name_.get())));
1524
+ }
1525
+ // Save service config.
1526
+ chand_->saved_service_config_ = std::move(service_config);
1527
+ }
1528
+ // Find LB policy config.
1529
+ ProcessLbPolicy(result, parsed_service_config,
1530
+ &service_config_result.lb_policy_config);
1531
+ grpc_core::UniquePtr<char> lb_policy_name(
1532
+ gpr_strdup((service_config_result.lb_policy_config)->name()));
1533
+ // Swap out the data used by GetChannelInfo().
1534
+ {
1535
+ MutexLock lock(&chand_->info_mu_);
1536
+ chand_->info_lb_policy_name_ = std::move(lb_policy_name);
1537
+ if (service_config_json != nullptr) {
1538
+ chand_->info_service_config_json_ = std::move(service_config_json);
1539
+ }
1540
+ }
1541
+ // Return results.
1542
+ return service_config_result;
1543
+ }
1544
+
1545
+ void ChannelData::ChannelConfigHelper::ApplyConfigSelector(
1546
+ bool service_config_changed,
1547
+ RefCountedPtr<ConfigSelector> config_selector) {
1548
+ chand_->UpdateServiceConfigInDataPlaneLocked(service_config_changed,
1549
+ std::move(config_selector));
1550
+ }
1551
+
1552
+ void ChannelData::ChannelConfigHelper::ResolverTransientFailure(
1553
+ grpc_error* error) {
1554
+ MutexLock lock(&chand_->data_plane_mu_);
1555
+ GRPC_ERROR_UNREF(chand_->resolver_transient_failure_error_);
1556
+ chand_->resolver_transient_failure_error_ = error;
1557
+ }
1558
+
1559
+ void ChannelData::ChannelConfigHelper::ProcessLbPolicy(
1560
+ const Resolver::Result& resolver_result,
1561
+ const internal::ClientChannelGlobalParsedConfig* parsed_service_config,
1562
+ RefCountedPtr<LoadBalancingPolicy::Config>* lb_policy_config) {
1563
+ // Prefer the LB policy config found in the service config.
1564
+ if (parsed_service_config != nullptr &&
1565
+ parsed_service_config->parsed_lb_config() != nullptr) {
1566
+ *lb_policy_config = parsed_service_config->parsed_lb_config();
1567
+ return;
1568
+ }
1569
+ // Try the deprecated LB policy name from the service config.
1570
+ // If not, try the setting from channel args.
1571
+ const char* policy_name = nullptr;
1572
+ if (parsed_service_config != nullptr &&
1573
+ !parsed_service_config->parsed_deprecated_lb_policy().empty()) {
1574
+ policy_name = parsed_service_config->parsed_deprecated_lb_policy().c_str();
1575
+ } else {
1576
+ const grpc_arg* channel_arg =
1577
+ grpc_channel_args_find(resolver_result.args, GRPC_ARG_LB_POLICY_NAME);
1578
+ policy_name = grpc_channel_arg_get_string(channel_arg);
1579
+ }
1580
+ // Use pick_first if nothing was specified and we didn't select grpclb
1581
+ // above.
1582
+ if (policy_name == nullptr) policy_name = "pick_first";
1583
+ // Now that we have the policy name, construct an empty config for it.
1584
+ Json config_json = Json::Array{Json::Object{
1585
+ {policy_name, Json::Object{}},
1586
+ }};
1587
+ grpc_error* parse_error = GRPC_ERROR_NONE;
1588
+ *lb_policy_config = LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
1589
+ config_json, &parse_error);
1590
+ // The policy name came from one of three places:
1591
+ // - The deprecated loadBalancingPolicy field in the service config,
1592
+ // in which case the code in ClientChannelServiceConfigParser
1593
+ // already verified that the policy does not require a config.
1594
+ // - One of the hard-coded values here, all of which are known to not
1595
+ // require a config.
1596
+ // - A channel arg, in which case the application did something that
1597
+ // is a misuse of our API.
1598
+ // In the first two cases, these assertions will always be true. In
1599
+ // the last case, this is probably fine for now.
1600
+ // TODO(roth): If the last case becomes a problem, add better error
1601
+ // handling here.
1602
+ GPR_ASSERT(*lb_policy_config != nullptr);
1603
+ GPR_ASSERT(parse_error == GRPC_ERROR_NONE);
1604
+ }
1605
+
1004
1606
  //
1005
1607
  // ChannelData implementation
1006
1608
  //
@@ -1040,6 +1642,15 @@ RefCountedPtr<SubchannelPoolInterface> GetSubchannelPool(
1040
1642
  return GlobalSubchannelPool::instance();
1041
1643
  }
1042
1644
 
1645
+ channelz::ChannelNode* GetChannelzNode(const grpc_channel_args* args) {
1646
+ const grpc_arg* arg =
1647
+ grpc_channel_args_find(args, GRPC_ARG_CHANNELZ_CHANNEL_NODE);
1648
+ if (arg != nullptr && arg->type == GRPC_ARG_POINTER) {
1649
+ return static_cast<channelz::ChannelNode*>(arg->value.pointer.p);
1650
+ }
1651
+ return nullptr;
1652
+ }
1653
+
1043
1654
  ChannelData::ChannelData(grpc_channel_element_args* args, grpc_error** error)
1044
1655
  : deadline_checking_enabled_(
1045
1656
  grpc_deadline_checking_enabled(args->channel_args)),
@@ -1049,14 +1660,18 @@ ChannelData::ChannelData(grpc_channel_element_args* args, grpc_error** error)
1049
1660
  owning_stack_(args->channel_stack),
1050
1661
  client_channel_factory_(
1051
1662
  ClientChannelFactory::GetFromChannelArgs(args->channel_args)),
1052
- data_plane_combiner_(grpc_combiner_create()),
1053
- combiner_(grpc_combiner_create()),
1663
+ channelz_node_(GetChannelzNode(args->channel_args)),
1664
+ channel_config_helper_(this),
1665
+ work_serializer_(std::make_shared<WorkSerializer>()),
1054
1666
  interested_parties_(grpc_pollset_set_create()),
1055
1667
  subchannel_pool_(GetSubchannelPool(args->channel_args)),
1668
+ state_tracker_("client_channel", GRPC_CHANNEL_IDLE),
1056
1669
  disconnect_error_(GRPC_ERROR_NONE) {
1670
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
1671
+ gpr_log(GPR_INFO, "chand=%p: creating client_channel for channel stack %p",
1672
+ this, owning_stack_);
1673
+ }
1057
1674
  // Initialize data members.
1058
- grpc_connectivity_state_init(&state_tracker_, GRPC_CHANNEL_IDLE,
1059
- "client_channel");
1060
1675
  gpr_mu_init(&info_mu_);
1061
1676
  // Start backup polling.
1062
1677
  grpc_client_channel_start_backup_polling(interested_parties_);
@@ -1078,8 +1693,6 @@ ChannelData::ChannelData(grpc_channel_element_args* args, grpc_error** error)
1078
1693
  // Get default service config
1079
1694
  const char* service_config_json = grpc_channel_arg_get_string(
1080
1695
  grpc_channel_args_find(args->channel_args, GRPC_ARG_SERVICE_CONFIG));
1081
- // TODO(yashkt): Make sure we set the channel in TRANSIENT_FAILURE on an
1082
- // invalid default service config
1083
1696
  if (service_config_json != nullptr) {
1084
1697
  *error = GRPC_ERROR_NONE;
1085
1698
  default_service_config_ = ServiceConfig::Create(service_config_json, error);
@@ -1096,259 +1709,254 @@ ChannelData::ChannelData(grpc_channel_element_args* args, grpc_error** error)
1096
1709
  grpc_uri_destroy(uri);
1097
1710
  char* proxy_name = nullptr;
1098
1711
  grpc_channel_args* new_args = nullptr;
1099
- grpc_proxy_mappers_map_name(server_uri, args->channel_args, &proxy_name,
1100
- &new_args);
1101
- UniquePtr<char> target_uri(proxy_name != nullptr ? proxy_name
1102
- : gpr_strdup(server_uri));
1103
- // Instantiate resolving LB policy.
1104
- LoadBalancingPolicy::Args lb_args;
1105
- lb_args.combiner = combiner_;
1106
- lb_args.channel_control_helper =
1107
- UniquePtr<LoadBalancingPolicy::ChannelControlHelper>(
1108
- New<ClientChannelControlHelper>(this));
1109
- lb_args.args = new_args != nullptr ? new_args : args->channel_args;
1110
- resolving_lb_policy_.reset(New<ResolvingLoadBalancingPolicy>(
1111
- std::move(lb_args), &grpc_client_channel_routing_trace,
1112
- std::move(target_uri), ProcessResolverResultLocked, this, error));
1113
- grpc_channel_args_destroy(new_args);
1114
- if (*error != GRPC_ERROR_NONE) {
1115
- // Orphan the resolving LB policy and flush the exec_ctx to ensure
1116
- // that it finishes shutting down. This ensures that if we are
1117
- // failing, we destroy the ClientChannelControlHelper (and thus
1118
- // unref the channel stack) before we return.
1119
- // TODO(roth): This is not a complete solution, because it only
1120
- // catches the case where channel stack initialization fails in this
1121
- // particular filter. If there is a failure in a different filter, we
1122
- // will leave a dangling ref here, which can cause a crash. Fortunately,
1123
- // in practice, there are no other filters that can cause failures in
1124
- // channel stack initialization, so this works for now.
1125
- resolving_lb_policy_.reset();
1126
- ExecCtx::Get()->Flush();
1127
- } else {
1128
- grpc_pollset_set_add_pollset_set(resolving_lb_policy_->interested_parties(),
1129
- interested_parties_);
1130
- if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
1131
- gpr_log(GPR_INFO, "chand=%p: created resolving_lb_policy=%p", this,
1132
- resolving_lb_policy_.get());
1133
- }
1712
+ ProxyMapperRegistry::MapName(server_uri, args->channel_args, &proxy_name,
1713
+ &new_args);
1714
+ target_uri_.reset(proxy_name != nullptr ? proxy_name
1715
+ : gpr_strdup(server_uri));
1716
+ channel_args_ = new_args != nullptr
1717
+ ? new_args
1718
+ : grpc_channel_args_copy(args->channel_args);
1719
+ keepalive_time_ = grpc_channel_args_find_integer(
1720
+ channel_args_, GRPC_ARG_KEEPALIVE_TIME_MS,
1721
+ {-1 /* default value, unset */, 1, INT_MAX});
1722
+ if (!ResolverRegistry::IsValidTarget(target_uri_.get())) {
1723
+ std::string error_message =
1724
+ absl::StrCat("the target uri is not valid: ", target_uri_.get());
1725
+ *error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(error_message.c_str());
1726
+ return;
1134
1727
  }
1728
+ *error = GRPC_ERROR_NONE;
1135
1729
  }
1136
1730
 
1137
1731
  ChannelData::~ChannelData() {
1138
- if (resolving_lb_policy_ != nullptr) {
1139
- grpc_pollset_set_del_pollset_set(resolving_lb_policy_->interested_parties(),
1140
- interested_parties_);
1141
- resolving_lb_policy_.reset();
1732
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
1733
+ gpr_log(GPR_INFO, "chand=%p: destroying channel", this);
1142
1734
  }
1735
+ DestroyResolvingLoadBalancingPolicyLocked();
1736
+ grpc_channel_args_destroy(channel_args_);
1737
+ GRPC_ERROR_UNREF(resolver_transient_failure_error_);
1143
1738
  // Stop backup polling.
1144
1739
  grpc_client_channel_stop_backup_polling(interested_parties_);
1145
1740
  grpc_pollset_set_destroy(interested_parties_);
1146
- GRPC_COMBINER_UNREF(data_plane_combiner_, "client_channel");
1147
- GRPC_COMBINER_UNREF(combiner_, "client_channel");
1148
1741
  GRPC_ERROR_UNREF(disconnect_error_.Load(MemoryOrder::RELAXED));
1149
- grpc_connectivity_state_destroy(&state_tracker_);
1150
1742
  gpr_mu_destroy(&info_mu_);
1151
1743
  }
1152
1744
 
1153
- void ChannelData::ProcessLbPolicy(
1154
- const Resolver::Result& resolver_result,
1155
- const internal::ClientChannelGlobalParsedObject* parsed_service_config,
1156
- UniquePtr<char>* lb_policy_name,
1157
- RefCountedPtr<ParsedLoadBalancingConfig>* lb_policy_config) {
1158
- // Prefer the LB policy name found in the service config.
1159
- if (parsed_service_config != nullptr &&
1160
- parsed_service_config->parsed_lb_config() != nullptr) {
1161
- lb_policy_name->reset(
1162
- gpr_strdup(parsed_service_config->parsed_lb_config()->name()));
1163
- *lb_policy_config = parsed_service_config->parsed_lb_config();
1164
- return;
1165
- }
1166
- const char* local_policy_name = nullptr;
1167
- if (parsed_service_config != nullptr &&
1168
- parsed_service_config->parsed_deprecated_lb_policy() != nullptr) {
1169
- local_policy_name = parsed_service_config->parsed_deprecated_lb_policy();
1170
- } else {
1171
- const grpc_arg* channel_arg =
1172
- grpc_channel_args_find(resolver_result.args, GRPC_ARG_LB_POLICY_NAME);
1173
- local_policy_name = grpc_channel_arg_get_string(channel_arg);
1174
- }
1175
- // Special case: If at least one balancer address is present, we use
1176
- // the grpclb policy, regardless of what the resolver has returned.
1177
- bool found_balancer_address = false;
1178
- for (size_t i = 0; i < resolver_result.addresses.size(); ++i) {
1179
- const ServerAddress& address = resolver_result.addresses[i];
1180
- if (address.IsBalancer()) {
1181
- found_balancer_address = true;
1182
- break;
1183
- }
1184
- }
1185
- if (found_balancer_address) {
1186
- if (local_policy_name != nullptr &&
1187
- strcmp(local_policy_name, "grpclb") != 0) {
1188
- gpr_log(GPR_INFO,
1189
- "resolver requested LB policy %s but provided at least one "
1190
- "balancer address -- forcing use of grpclb LB policy",
1191
- local_policy_name);
1192
- }
1193
- local_policy_name = "grpclb";
1194
- }
1195
- // Use pick_first if nothing was specified and we didn't select grpclb
1196
- // above.
1197
- lb_policy_name->reset(gpr_strdup(
1198
- local_policy_name == nullptr ? "pick_first" : local_policy_name));
1199
- }
1200
-
1201
- // Synchronous callback from ResolvingLoadBalancingPolicy to process a
1202
- // resolver result update.
1203
- bool ChannelData::ProcessResolverResultLocked(
1204
- void* arg, const Resolver::Result& result, const char** lb_policy_name,
1205
- RefCountedPtr<ParsedLoadBalancingConfig>* lb_policy_config,
1206
- grpc_error** service_config_error) {
1207
- ChannelData* chand = static_cast<ChannelData*>(arg);
1208
- RefCountedPtr<ServiceConfig> service_config;
1209
- // If resolver did not return a service config or returned an invalid service
1210
- // config, we need a fallback service config.
1211
- if (result.service_config_error != GRPC_ERROR_NONE) {
1212
- // If the service config was invalid, then fallback to the saved service
1213
- // config. If there is no saved config either, use the default service
1214
- // config.
1215
- if (chand->saved_service_config_ != nullptr) {
1216
- service_config = chand->saved_service_config_;
1217
- if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
1218
- gpr_log(GPR_INFO,
1219
- "chand=%p: resolver returned invalid service config. "
1220
- "Continuing to use previous service config.",
1221
- chand);
1222
- }
1223
- } else if (chand->default_service_config_ != nullptr) {
1745
+ void ChannelData::UpdateStateAndPickerLocked(
1746
+ grpc_connectivity_state state, const absl::Status& status,
1747
+ const char* reason,
1748
+ std::unique_ptr<LoadBalancingPolicy::SubchannelPicker> picker) {
1749
+ // Clean the control plane when entering IDLE.
1750
+ if (picker_ == nullptr) {
1751
+ health_check_service_name_.reset();
1752
+ saved_service_config_.reset();
1753
+ saved_config_selector_.reset();
1754
+ received_first_resolver_result_ = false;
1755
+ }
1756
+ // Update connectivity state.
1757
+ state_tracker_.SetState(state, status, reason);
1758
+ if (channelz_node_ != nullptr) {
1759
+ channelz_node_->SetConnectivityState(state);
1760
+ channelz_node_->AddTraceEvent(
1761
+ channelz::ChannelTrace::Severity::Info,
1762
+ grpc_slice_from_static_string(
1763
+ channelz::ChannelNode::GetChannelConnectivityStateChangeString(
1764
+ state)));
1765
+ }
1766
+ // Grab data plane lock to do subchannel updates and update the picker.
1767
+ //
1768
+ // Note that we want to minimize the work done while holding the data
1769
+ // plane lock, to keep the critical section small. So, for all of the
1770
+ // objects that we might wind up unreffing here, we actually hold onto
1771
+ // the refs until after we release the lock, and then unref them at
1772
+ // that point. This includes the following:
1773
+ // - refs to subchannel wrappers in the keys of pending_subchannel_updates_
1774
+ // - ref stored in retry_throttle_data_
1775
+ // - ref stored in service_config_
1776
+ // - ref stored in config_selector_
1777
+ // - ownership of the existing picker in picker_
1778
+ RefCountedPtr<ServerRetryThrottleData> retry_throttle_data_to_unref;
1779
+ RefCountedPtr<ServiceConfig> service_config_to_unref;
1780
+ RefCountedPtr<ConfigSelector> config_selector_to_unref;
1781
+ {
1782
+ MutexLock lock(&data_plane_mu_);
1783
+ // Handle subchannel updates.
1784
+ for (auto& p : pending_subchannel_updates_) {
1224
1785
  if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
1225
1786
  gpr_log(GPR_INFO,
1226
- "chand=%p: resolver returned invalid service config. Using "
1227
- "default service config provided by client API.",
1228
- chand);
1787
+ "chand=%p: updating subchannel wrapper %p data plane "
1788
+ "connected_subchannel to %p",
1789
+ this, p.first.get(), p.second.get());
1229
1790
  }
1230
- service_config = chand->default_service_config_;
1791
+ // Note: We do not remove the entry from pending_subchannel_updates_
1792
+ // here, since this would unref the subchannel wrapper; instead,
1793
+ // we wait until we've released the lock to clear the map.
1794
+ p.first->set_connected_subchannel_in_data_plane(std::move(p.second));
1231
1795
  }
1232
- } else if (result.service_config == nullptr) {
1233
- if (chand->default_service_config_ != nullptr) {
1234
- if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
1235
- gpr_log(GPR_INFO,
1236
- "chand=%p: resolver returned no service config. Using default "
1237
- "service config provided by client API.",
1238
- chand);
1796
+ // Swap out the picker.
1797
+ // Note: Original value will be destroyed after the lock is released.
1798
+ picker_.swap(picker);
1799
+ // Clean the data plane if the updated picker is nullptr.
1800
+ if (picker_ == nullptr) {
1801
+ received_service_config_data_ = false;
1802
+ // Note: We save the objects to unref until after the lock is released.
1803
+ retry_throttle_data_to_unref = std::move(retry_throttle_data_);
1804
+ service_config_to_unref = std::move(service_config_);
1805
+ config_selector_to_unref = std::move(config_selector_);
1806
+ }
1807
+ // Re-process queued picks.
1808
+ for (QueuedPick* pick = queued_picks_; pick != nullptr; pick = pick->next) {
1809
+ grpc_call_element* elem = pick->elem;
1810
+ CallData* calld = static_cast<CallData*>(elem->call_data);
1811
+ grpc_error* error = GRPC_ERROR_NONE;
1812
+ if (calld->PickSubchannelLocked(elem, &error)) {
1813
+ calld->AsyncPickDone(elem, error);
1239
1814
  }
1240
- service_config = chand->default_service_config_;
1241
1815
  }
1242
- } else {
1243
- service_config = result.service_config;
1244
1816
  }
1245
- *service_config_error = GRPC_ERROR_REF(result.service_config_error);
1246
- if (service_config == nullptr &&
1247
- result.service_config_error != GRPC_ERROR_NONE) {
1248
- return false;
1817
+ // Clear the pending update map after releasing the lock, to keep the
1818
+ // critical section small.
1819
+ pending_subchannel_updates_.clear();
1820
+ }
1821
+
1822
+ void ChannelData::UpdateServiceConfigInDataPlaneLocked(
1823
+ bool service_config_changed,
1824
+ RefCountedPtr<ConfigSelector> config_selector) {
1825
+ // Check if ConfigSelector has changed.
1826
+ const bool config_selector_changed =
1827
+ saved_config_selector_ != config_selector;
1828
+ saved_config_selector_ = config_selector;
1829
+ // We want to set the service config at least once, even if the
1830
+ // resolver does not return a config, because that ensures that we
1831
+ // disable retries if they are not enabled in the service config.
1832
+ // TODO(roth): Consider removing the received_first_resolver_result_ check
1833
+ // when we implement transparent retries.
1834
+ if (!service_config_changed && !config_selector_changed &&
1835
+ received_first_resolver_result_) {
1836
+ return;
1249
1837
  }
1250
- UniquePtr<char> service_config_json;
1251
- // Process service config.
1252
- const internal::ClientChannelGlobalParsedObject* parsed_service_config =
1253
- nullptr;
1254
- if (service_config != nullptr) {
1255
- parsed_service_config =
1256
- static_cast<const internal::ClientChannelGlobalParsedObject*>(
1257
- service_config->GetParsedGlobalServiceConfigObject(
1838
+ received_first_resolver_result_ = true;
1839
+ // Get retry throttle data from service config.
1840
+ RefCountedPtr<ServerRetryThrottleData> retry_throttle_data;
1841
+ if (saved_service_config_ != nullptr) {
1842
+ const internal::ClientChannelGlobalParsedConfig* parsed_service_config =
1843
+ static_cast<const internal::ClientChannelGlobalParsedConfig*>(
1844
+ saved_service_config_->GetGlobalParsedConfig(
1258
1845
  internal::ClientChannelServiceConfigParser::ParserIndex()));
1259
- }
1260
- const bool service_config_changed =
1261
- ((service_config == nullptr) !=
1262
- (chand->saved_service_config_ == nullptr)) ||
1263
- (service_config != nullptr &&
1264
- strcmp(service_config->service_config_json(),
1265
- chand->saved_service_config_->service_config_json()) != 0);
1266
- if (service_config_changed) {
1267
- service_config_json.reset(gpr_strdup(
1268
- service_config != nullptr ? service_config->service_config_json()
1269
- : ""));
1270
- if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
1271
- gpr_log(GPR_INFO,
1272
- "chand=%p: resolver returned updated service config: \"%s\"",
1273
- chand, service_config_json.get());
1274
- }
1275
- chand->saved_service_config_ = std::move(service_config);
1276
1846
  if (parsed_service_config != nullptr) {
1277
- chand->health_check_service_name_.reset(
1278
- gpr_strdup(parsed_service_config->health_check_service_name()));
1279
- } else {
1280
- chand->health_check_service_name_.reset();
1847
+ absl::optional<internal::ClientChannelGlobalParsedConfig::RetryThrottling>
1848
+ retry_throttle_config = parsed_service_config->retry_throttling();
1849
+ if (retry_throttle_config.has_value()) {
1850
+ retry_throttle_data =
1851
+ internal::ServerRetryThrottleMap::GetDataForServer(
1852
+ server_name_.get(),
1853
+ retry_throttle_config.value().max_milli_tokens,
1854
+ retry_throttle_config.value().milli_token_ratio);
1855
+ }
1281
1856
  }
1282
1857
  }
1283
- // We want to set the service config at least once. This should not really be
1284
- // needed, but we are doing it as a defensive approach. This can be removed,
1285
- // if we feel it is unnecessary.
1286
- if (service_config_changed || !chand->received_first_resolver_result_) {
1287
- chand->received_first_resolver_result_ = true;
1288
- Optional<internal::ClientChannelGlobalParsedObject::RetryThrottling>
1289
- retry_throttle_data;
1290
- if (parsed_service_config != nullptr) {
1291
- retry_throttle_data = parsed_service_config->retry_throttling();
1292
- }
1293
- // Create service config setter to update channel state in the data
1294
- // plane combiner. Destroys itself when done.
1295
- New<ServiceConfigSetter>(chand, retry_throttle_data,
1296
- chand->saved_service_config_);
1858
+ // Create default config selector if not provided by resolver.
1859
+ if (config_selector == nullptr) {
1860
+ config_selector =
1861
+ MakeRefCounted<DefaultConfigSelector>(saved_service_config_);
1297
1862
  }
1298
- UniquePtr<char> processed_lb_policy_name;
1299
- chand->ProcessLbPolicy(result, parsed_service_config,
1300
- &processed_lb_policy_name, lb_policy_config);
1301
- // Swap out the data used by GetChannelInfo().
1863
+ // Grab data plane lock to update service config.
1864
+ //
1865
+ // We defer unreffing the old values (and deallocating memory) until
1866
+ // after releasing the lock to keep the critical section small.
1867
+ RefCountedPtr<ServiceConfig> service_config_to_unref = saved_service_config_;
1868
+ RefCountedPtr<ConfigSelector> config_selector_to_unref =
1869
+ std::move(config_selector);
1302
1870
  {
1303
- MutexLock lock(&chand->info_mu_);
1304
- chand->info_lb_policy_name_ = std::move(processed_lb_policy_name);
1305
- if (service_config_json != nullptr) {
1306
- chand->info_service_config_json_ = std::move(service_config_json);
1871
+ MutexLock lock(&data_plane_mu_);
1872
+ GRPC_ERROR_UNREF(resolver_transient_failure_error_);
1873
+ resolver_transient_failure_error_ = GRPC_ERROR_NONE;
1874
+ // Update service config.
1875
+ received_service_config_data_ = true;
1876
+ // Old values will be unreffed after lock is released.
1877
+ retry_throttle_data_.swap(retry_throttle_data);
1878
+ service_config_.swap(service_config_to_unref);
1879
+ config_selector_.swap(config_selector_to_unref);
1880
+ // Re-process queued picks.
1881
+ for (QueuedPick* pick = queued_picks_; pick != nullptr; pick = pick->next) {
1882
+ grpc_call_element* elem = pick->elem;
1883
+ CallData* calld = static_cast<CallData*>(elem->call_data);
1884
+ grpc_error* error = GRPC_ERROR_NONE;
1885
+ if (calld->PickSubchannelLocked(elem, &error)) {
1886
+ calld->AsyncPickDone(elem, error);
1887
+ }
1307
1888
  }
1308
1889
  }
1309
- // Return results.
1310
- *lb_policy_name = chand->info_lb_policy_name_.get();
1311
- return service_config_changed;
1890
+ // Old values will be unreffed after lock is released when they go out
1891
+ // of scope.
1892
+ }
1893
+
1894
+ void ChannelData::CreateResolvingLoadBalancingPolicyLocked() {
1895
+ // Instantiate resolving LB policy.
1896
+ LoadBalancingPolicy::Args lb_args;
1897
+ lb_args.work_serializer = work_serializer_;
1898
+ lb_args.channel_control_helper =
1899
+ absl::make_unique<ClientChannelControlHelper>(this);
1900
+ lb_args.args = channel_args_;
1901
+ grpc_core::UniquePtr<char> target_uri(gpr_strdup(target_uri_.get()));
1902
+ resolving_lb_policy_.reset(new ResolvingLoadBalancingPolicy(
1903
+ std::move(lb_args), &grpc_client_channel_routing_trace,
1904
+ std::move(target_uri), &channel_config_helper_));
1905
+ grpc_pollset_set_add_pollset_set(resolving_lb_policy_->interested_parties(),
1906
+ interested_parties_);
1907
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
1908
+ gpr_log(GPR_INFO, "chand=%p: created resolving_lb_policy=%p", this,
1909
+ resolving_lb_policy_.get());
1910
+ }
1911
+ }
1912
+
1913
+ void ChannelData::DestroyResolvingLoadBalancingPolicyLocked() {
1914
+ if (resolving_lb_policy_ != nullptr) {
1915
+ grpc_pollset_set_del_pollset_set(resolving_lb_policy_->interested_parties(),
1916
+ interested_parties_);
1917
+ resolving_lb_policy_.reset();
1918
+ }
1312
1919
  }
1313
1920
 
1314
1921
  grpc_error* ChannelData::DoPingLocked(grpc_transport_op* op) {
1315
- if (grpc_connectivity_state_check(&state_tracker_) != GRPC_CHANNEL_READY) {
1922
+ if (state_tracker_.state() != GRPC_CHANNEL_READY) {
1316
1923
  return GRPC_ERROR_CREATE_FROM_STATIC_STRING("channel not connected");
1317
1924
  }
1318
- LoadBalancingPolicy::PickArgs pick;
1319
- grpc_error* error = GRPC_ERROR_NONE;
1320
- picker_->Pick(&pick, &error);
1321
- if (pick.connected_subchannel != nullptr) {
1322
- pick.connected_subchannel->Ping(op->send_ping.on_initiate,
1323
- op->send_ping.on_ack);
1925
+ LoadBalancingPolicy::PickResult result =
1926
+ picker_->Pick(LoadBalancingPolicy::PickArgs());
1927
+ ConnectedSubchannel* connected_subchannel = nullptr;
1928
+ if (result.subchannel != nullptr) {
1929
+ SubchannelWrapper* subchannel =
1930
+ static_cast<SubchannelWrapper*>(result.subchannel.get());
1931
+ connected_subchannel = subchannel->connected_subchannel();
1932
+ }
1933
+ if (connected_subchannel != nullptr) {
1934
+ connected_subchannel->Ping(op->send_ping.on_initiate, op->send_ping.on_ack);
1324
1935
  } else {
1325
- if (error == GRPC_ERROR_NONE) {
1326
- error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1936
+ if (result.error == GRPC_ERROR_NONE) {
1937
+ result.error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1327
1938
  "LB policy dropped call on ping");
1328
1939
  }
1329
1940
  }
1330
- return error;
1941
+ return result.error;
1331
1942
  }
1332
1943
 
1333
- void ChannelData::StartTransportOpLocked(void* arg, grpc_error* ignored) {
1334
- grpc_transport_op* op = static_cast<grpc_transport_op*>(arg);
1335
- grpc_channel_element* elem =
1336
- static_cast<grpc_channel_element*>(op->handler_private.extra_arg);
1337
- ChannelData* chand = static_cast<ChannelData*>(elem->channel_data);
1944
+ void ChannelData::StartTransportOpLocked(grpc_transport_op* op) {
1338
1945
  // Connectivity watch.
1339
- if (op->on_connectivity_state_change != nullptr) {
1340
- grpc_connectivity_state_notify_on_state_change(
1341
- &chand->state_tracker_, op->connectivity_state,
1342
- op->on_connectivity_state_change);
1343
- op->on_connectivity_state_change = nullptr;
1344
- op->connectivity_state = nullptr;
1946
+ if (op->start_connectivity_watch != nullptr) {
1947
+ state_tracker_.AddWatcher(op->start_connectivity_watch_state,
1948
+ std::move(op->start_connectivity_watch));
1949
+ }
1950
+ if (op->stop_connectivity_watch != nullptr) {
1951
+ state_tracker_.RemoveWatcher(op->stop_connectivity_watch);
1345
1952
  }
1346
1953
  // Ping.
1347
1954
  if (op->send_ping.on_initiate != nullptr || op->send_ping.on_ack != nullptr) {
1348
- grpc_error* error = chand->DoPingLocked(op);
1955
+ grpc_error* error = DoPingLocked(op);
1349
1956
  if (error != GRPC_ERROR_NONE) {
1350
- GRPC_CLOSURE_SCHED(op->send_ping.on_initiate, GRPC_ERROR_REF(error));
1351
- GRPC_CLOSURE_SCHED(op->send_ping.on_ack, error);
1957
+ ExecCtx::Run(DEBUG_LOCATION, op->send_ping.on_initiate,
1958
+ GRPC_ERROR_REF(error));
1959
+ ExecCtx::Run(DEBUG_LOCATION, op->send_ping.on_ack, error);
1352
1960
  }
1353
1961
  op->bind_pollset = nullptr;
1354
1962
  op->send_ping.on_initiate = nullptr;
@@ -1356,29 +1964,40 @@ void ChannelData::StartTransportOpLocked(void* arg, grpc_error* ignored) {
1356
1964
  }
1357
1965
  // Reset backoff.
1358
1966
  if (op->reset_connect_backoff) {
1359
- if (chand->resolving_lb_policy_ != nullptr) {
1360
- chand->resolving_lb_policy_->ResetBackoffLocked();
1967
+ if (resolving_lb_policy_ != nullptr) {
1968
+ resolving_lb_policy_->ResetBackoffLocked();
1361
1969
  }
1362
1970
  }
1363
- // Disconnect.
1971
+ // Disconnect or enter IDLE.
1364
1972
  if (op->disconnect_with_error != GRPC_ERROR_NONE) {
1365
- grpc_error* error = GRPC_ERROR_NONE;
1366
- GPR_ASSERT(chand->disconnect_error_.CompareExchangeStrong(
1367
- &error, op->disconnect_with_error, MemoryOrder::ACQ_REL,
1368
- MemoryOrder::ACQUIRE));
1369
- grpc_pollset_set_del_pollset_set(
1370
- chand->resolving_lb_policy_->interested_parties(),
1371
- chand->interested_parties_);
1372
- chand->resolving_lb_policy_.reset();
1373
- // Will delete itself.
1374
- New<ConnectivityStateAndPickerSetter>(
1375
- chand, GRPC_CHANNEL_SHUTDOWN, "shutdown from API",
1376
- UniquePtr<LoadBalancingPolicy::SubchannelPicker>(
1377
- New<LoadBalancingPolicy::TransientFailurePicker>(
1378
- GRPC_ERROR_REF(op->disconnect_with_error))));
1379
- }
1380
- GRPC_CHANNEL_STACK_UNREF(chand->owning_stack_, "start_transport_op");
1381
- GRPC_CLOSURE_SCHED(op->on_consumed, GRPC_ERROR_NONE);
1973
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
1974
+ gpr_log(GPR_INFO, "chand=%p: disconnect_with_error: %s", this,
1975
+ grpc_error_string(op->disconnect_with_error));
1976
+ }
1977
+ DestroyResolvingLoadBalancingPolicyLocked();
1978
+ intptr_t value;
1979
+ if (grpc_error_get_int(op->disconnect_with_error,
1980
+ GRPC_ERROR_INT_CHANNEL_CONNECTIVITY_STATE, &value) &&
1981
+ static_cast<grpc_connectivity_state>(value) == GRPC_CHANNEL_IDLE) {
1982
+ if (disconnect_error() == GRPC_ERROR_NONE) {
1983
+ // Enter IDLE state.
1984
+ UpdateStateAndPickerLocked(GRPC_CHANNEL_IDLE, absl::Status(),
1985
+ "channel entering IDLE", nullptr);
1986
+ }
1987
+ GRPC_ERROR_UNREF(op->disconnect_with_error);
1988
+ } else {
1989
+ // Disconnect.
1990
+ GPR_ASSERT(disconnect_error_.Load(MemoryOrder::RELAXED) ==
1991
+ GRPC_ERROR_NONE);
1992
+ disconnect_error_.Store(op->disconnect_with_error, MemoryOrder::RELEASE);
1993
+ UpdateStateAndPickerLocked(
1994
+ GRPC_CHANNEL_SHUTDOWN, absl::Status(), "shutdown from API",
1995
+ absl::make_unique<LoadBalancingPolicy::TransientFailurePicker>(
1996
+ GRPC_ERROR_REF(op->disconnect_with_error)));
1997
+ }
1998
+ }
1999
+ GRPC_CHANNEL_STACK_UNREF(owning_stack_, "start_transport_op");
2000
+ ExecCtx::Run(DEBUG_LOCATION, op->on_consumed, GRPC_ERROR_NONE);
1382
2001
  }
1383
2002
 
1384
2003
  void ChannelData::StartTransportOp(grpc_channel_element* elem,
@@ -1389,14 +2008,10 @@ void ChannelData::StartTransportOp(grpc_channel_element* elem,
1389
2008
  if (op->bind_pollset != nullptr) {
1390
2009
  grpc_pollset_set_add_pollset(chand->interested_parties_, op->bind_pollset);
1391
2010
  }
1392
- // Pop into control plane combiner for remaining ops.
1393
- op->handler_private.extra_arg = elem;
2011
+ // Pop into control plane work_serializer for remaining ops.
1394
2012
  GRPC_CHANNEL_STACK_REF(chand->owning_stack_, "start_transport_op");
1395
- GRPC_CLOSURE_SCHED(
1396
- GRPC_CLOSURE_INIT(&op->handler_private.closure,
1397
- ChannelData::StartTransportOpLocked, op,
1398
- grpc_combiner_scheduler(chand->combiner_)),
1399
- GRPC_ERROR_NONE);
2013
+ chand->work_serializer_->Run(
2014
+ [chand, op]() { chand->StartTransportOpLocked(op); }, DEBUG_LOCATION);
1400
2015
  }
1401
2016
 
1402
2017
  void ChannelData::GetChannelInfo(grpc_channel_element* elem,
@@ -1436,26 +2051,47 @@ void ChannelData::RemoveQueuedPick(QueuedPick* to_remove,
1436
2051
  }
1437
2052
  }
1438
2053
 
1439
- void ChannelData::TryToConnectLocked(void* arg, grpc_error* error_ignored) {
1440
- auto* chand = static_cast<ChannelData*>(arg);
1441
- if (chand->resolving_lb_policy_ != nullptr) {
1442
- chand->resolving_lb_policy_->ExitIdleLocked();
2054
+ RefCountedPtr<ConnectedSubchannel>
2055
+ ChannelData::GetConnectedSubchannelInDataPlane(
2056
+ SubchannelInterface* subchannel) const {
2057
+ SubchannelWrapper* subchannel_wrapper =
2058
+ static_cast<SubchannelWrapper*>(subchannel);
2059
+ ConnectedSubchannel* connected_subchannel =
2060
+ subchannel_wrapper->connected_subchannel_in_data_plane();
2061
+ if (connected_subchannel == nullptr) return nullptr;
2062
+ return connected_subchannel->Ref();
2063
+ }
2064
+
2065
+ void ChannelData::TryToConnectLocked() {
2066
+ if (resolving_lb_policy_ != nullptr) {
2067
+ resolving_lb_policy_->ExitIdleLocked();
2068
+ } else {
2069
+ CreateResolvingLoadBalancingPolicyLocked();
1443
2070
  }
1444
- GRPC_CHANNEL_STACK_UNREF(chand->owning_stack_, "TryToConnect");
2071
+ GRPC_CHANNEL_STACK_UNREF(owning_stack_, "TryToConnect");
1445
2072
  }
1446
2073
 
1447
2074
  grpc_connectivity_state ChannelData::CheckConnectivityState(
1448
2075
  bool try_to_connect) {
1449
- grpc_connectivity_state out = grpc_connectivity_state_check(&state_tracker_);
2076
+ grpc_connectivity_state out = state_tracker_.state();
1450
2077
  if (out == GRPC_CHANNEL_IDLE && try_to_connect) {
1451
2078
  GRPC_CHANNEL_STACK_REF(owning_stack_, "TryToConnect");
1452
- GRPC_CLOSURE_SCHED(GRPC_CLOSURE_CREATE(TryToConnectLocked, this,
1453
- grpc_combiner_scheduler(combiner_)),
1454
- GRPC_ERROR_NONE);
2079
+ work_serializer_->Run([this]() { TryToConnectLocked(); }, DEBUG_LOCATION);
1455
2080
  }
1456
2081
  return out;
1457
2082
  }
1458
2083
 
2084
+ void ChannelData::AddConnectivityWatcher(
2085
+ grpc_connectivity_state initial_state,
2086
+ OrphanablePtr<AsyncConnectivityStateWatcherInterface> watcher) {
2087
+ new ConnectivityWatcherAdder(this, initial_state, std::move(watcher));
2088
+ }
2089
+
2090
+ void ChannelData::RemoveConnectivityWatcher(
2091
+ AsyncConnectivityStateWatcherInterface* watcher) {
2092
+ new ConnectivityWatcherRemover(this, watcher);
2093
+ }
2094
+
1459
2095
  //
1460
2096
  // CallData implementation
1461
2097
  //
@@ -1508,6 +2144,7 @@ CallData::CallData(grpc_call_element* elem, const ChannelData& chand,
1508
2144
  owning_call_(args.call_stack),
1509
2145
  call_combiner_(args.call_combiner),
1510
2146
  call_context_(args.context),
2147
+ lb_call_state_(this),
1511
2148
  pending_send_initial_metadata_(false),
1512
2149
  pending_send_message_(false),
1513
2150
  pending_send_trailing_metadata_(false),
@@ -1518,6 +2155,10 @@ CallData::CallData(grpc_call_element* elem, const ChannelData& chand,
1518
2155
  CallData::~CallData() {
1519
2156
  grpc_slice_unref_internal(path_);
1520
2157
  GRPC_ERROR_UNREF(cancel_error_);
2158
+ if (backend_metric_data_ != nullptr) {
2159
+ backend_metric_data_
2160
+ ->LoadBalancingPolicy::BackendMetricData::~BackendMetricData();
2161
+ }
1521
2162
  // Make sure there are no remaining pending batches.
1522
2163
  for (size_t i = 0; i < GPR_ARRAY_SIZE(pending_batches_); ++i) {
1523
2164
  GPR_ASSERT(pending_batches_[i].batch == nullptr);
@@ -1532,15 +2173,17 @@ grpc_error* CallData::Init(grpc_call_element* elem,
1532
2173
  }
1533
2174
 
1534
2175
  void CallData::Destroy(grpc_call_element* elem,
1535
- const grpc_call_final_info* final_info,
2176
+ const grpc_call_final_info* /*final_info*/,
1536
2177
  grpc_closure* then_schedule_closure) {
1537
2178
  CallData* calld = static_cast<CallData*>(elem->call_data);
1538
- if (GPR_LIKELY(calld->subchannel_call_ != nullptr)) {
1539
- calld->subchannel_call_->SetAfterCallStackDestroy(then_schedule_closure);
1540
- then_schedule_closure = nullptr;
1541
- }
2179
+ RefCountedPtr<SubchannelCall> subchannel_call = calld->subchannel_call_;
1542
2180
  calld->~CallData();
1543
- GRPC_CLOSURE_SCHED(then_schedule_closure, GRPC_ERROR_NONE);
2181
+ if (GPR_LIKELY(subchannel_call != nullptr)) {
2182
+ subchannel_call->SetAfterCallStackDestroy(then_schedule_closure);
2183
+ } else {
2184
+ // TODO(yashkt) : This can potentially be a Closure::Run
2185
+ ExecCtx::Run(DEBUG_LOCATION, then_schedule_closure, GRPC_ERROR_NONE);
2186
+ }
1544
2187
  }
1545
2188
 
1546
2189
  void CallData::StartTransportStreamOpBatch(
@@ -1596,8 +2239,8 @@ void CallData::StartTransportStreamOpBatch(
1596
2239
  // Add the batch to the pending list.
1597
2240
  calld->PendingBatchesAdd(elem, batch);
1598
2241
  // Check if we've already gotten a subchannel call.
1599
- // Note that once we have completed the pick, we do not need to enter
1600
- // the channel combiner, which is more efficient (especially for
2242
+ // Note that once we have picked a subchannel, we do not need to acquire
2243
+ // the channel's data plane mutex, which is more efficient (especially for
1601
2244
  // streaming calls).
1602
2245
  if (calld->subchannel_call_ != nullptr) {
1603
2246
  if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
@@ -1609,18 +2252,15 @@ void CallData::StartTransportStreamOpBatch(
1609
2252
  return;
1610
2253
  }
1611
2254
  // We do not yet have a subchannel call.
1612
- // For batches containing a send_initial_metadata op, enter the channel
1613
- // combiner to start a pick.
2255
+ // For batches containing a send_initial_metadata op, acquire the
2256
+ // channel's data plane mutex to pick a subchannel.
1614
2257
  if (GPR_LIKELY(batch->send_initial_metadata)) {
1615
2258
  if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
1616
- gpr_log(GPR_INFO, "chand=%p calld=%p: entering client_channel combiner",
2259
+ gpr_log(GPR_INFO,
2260
+ "chand=%p calld=%p: grabbing data plane mutex to perform pick",
1617
2261
  chand, calld);
1618
2262
  }
1619
- GRPC_CLOSURE_SCHED(
1620
- GRPC_CLOSURE_INIT(
1621
- &batch->handler_private.closure, StartPickLocked, elem,
1622
- grpc_combiner_scheduler(chand->data_plane_combiner())),
1623
- GRPC_ERROR_NONE);
2263
+ PickSubchannel(elem, GRPC_ERROR_NONE);
1624
2264
  } else {
1625
2265
  // For all other batches, release the call combiner.
1626
2266
  if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
@@ -1740,18 +2380,52 @@ void CallData::FreeCachedSendOpDataForCompletedBatch(
1740
2380
  // LB recv_trailing_metadata_ready handling
1741
2381
  //
1742
2382
 
2383
+ void CallData::RecvTrailingMetadataReadyForLoadBalancingPolicy(
2384
+ void* arg, grpc_error* error) {
2385
+ CallData* calld = static_cast<CallData*>(arg);
2386
+ // Set error if call did not succeed.
2387
+ grpc_error* error_for_lb = GRPC_ERROR_NONE;
2388
+ if (error != GRPC_ERROR_NONE) {
2389
+ error_for_lb = error;
2390
+ } else {
2391
+ const auto& fields = calld->recv_trailing_metadata_->idx.named;
2392
+ GPR_ASSERT(fields.grpc_status != nullptr);
2393
+ grpc_status_code status =
2394
+ grpc_get_status_code_from_metadata(fields.grpc_status->md);
2395
+ std::string msg;
2396
+ if (status != GRPC_STATUS_OK) {
2397
+ error_for_lb = grpc_error_set_int(
2398
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("call failed"),
2399
+ GRPC_ERROR_INT_GRPC_STATUS, status);
2400
+ if (fields.grpc_message != nullptr) {
2401
+ error_for_lb = grpc_error_set_str(
2402
+ error_for_lb, GRPC_ERROR_STR_GRPC_MESSAGE,
2403
+ grpc_slice_ref_internal(GRPC_MDVALUE(fields.grpc_message->md)));
2404
+ }
2405
+ }
2406
+ }
2407
+ // Invoke callback to LB policy.
2408
+ Metadata trailing_metadata(calld, calld->recv_trailing_metadata_);
2409
+ calld->lb_recv_trailing_metadata_ready_(error_for_lb, &trailing_metadata,
2410
+ &calld->lb_call_state_);
2411
+ if (error == GRPC_ERROR_NONE) GRPC_ERROR_UNREF(error_for_lb);
2412
+ // Chain to original callback.
2413
+ Closure::Run(DEBUG_LOCATION, calld->original_recv_trailing_metadata_ready_,
2414
+ GRPC_ERROR_REF(error));
2415
+ }
2416
+
1743
2417
  void CallData::MaybeInjectRecvTrailingMetadataReadyForLoadBalancingPolicy(
1744
- const LoadBalancingPolicy::PickArgs& pick,
1745
2418
  grpc_transport_stream_op_batch* batch) {
1746
- if (pick.recv_trailing_metadata_ready != nullptr) {
1747
- *pick.original_recv_trailing_metadata_ready =
2419
+ if (lb_recv_trailing_metadata_ready_ != nullptr) {
2420
+ recv_trailing_metadata_ =
2421
+ batch->payload->recv_trailing_metadata.recv_trailing_metadata;
2422
+ original_recv_trailing_metadata_ready_ =
1748
2423
  batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready;
2424
+ GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready_,
2425
+ RecvTrailingMetadataReadyForLoadBalancingPolicy, this,
2426
+ grpc_schedule_on_exec_ctx);
1749
2427
  batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready =
1750
- pick.recv_trailing_metadata_ready;
1751
- if (pick.recv_trailing_metadata != nullptr) {
1752
- *pick.recv_trailing_metadata =
1753
- batch->payload->recv_trailing_metadata.recv_trailing_metadata;
1754
- }
2428
+ &recv_trailing_metadata_ready_;
1755
2429
  }
1756
2430
  }
1757
2431
 
@@ -1897,8 +2571,7 @@ void CallData::PendingBatchesFail(
1897
2571
  grpc_transport_stream_op_batch* batch = pending->batch;
1898
2572
  if (batch != nullptr) {
1899
2573
  if (batch->recv_trailing_metadata) {
1900
- MaybeInjectRecvTrailingMetadataReadyForLoadBalancingPolicy(pick_.pick,
1901
- batch);
2574
+ MaybeInjectRecvTrailingMetadataReadyForLoadBalancingPolicy(batch);
1902
2575
  }
1903
2576
  batch->handler_private.extra_arg = this;
1904
2577
  GRPC_CLOSURE_INIT(&batch->handler_private.closure,
@@ -1919,7 +2592,7 @@ void CallData::PendingBatchesFail(
1919
2592
 
1920
2593
  // This is called via the call combiner, so access to calld is synchronized.
1921
2594
  void CallData::ResumePendingBatchInCallCombiner(void* arg,
1922
- grpc_error* ignored) {
2595
+ grpc_error* /*ignored*/) {
1923
2596
  grpc_transport_stream_op_batch* batch =
1924
2597
  static_cast<grpc_transport_stream_op_batch*>(arg);
1925
2598
  SubchannelCall* subchannel_call =
@@ -1952,8 +2625,7 @@ void CallData::PendingBatchesResume(grpc_call_element* elem) {
1952
2625
  grpc_transport_stream_op_batch* batch = pending->batch;
1953
2626
  if (batch != nullptr) {
1954
2627
  if (batch->recv_trailing_metadata) {
1955
- MaybeInjectRecvTrailingMetadataReadyForLoadBalancingPolicy(pick_.pick,
1956
- batch);
2628
+ MaybeInjectRecvTrailingMetadataReadyForLoadBalancingPolicy(batch);
1957
2629
  }
1958
2630
  batch->handler_private.extra_arg = subchannel_call_.get();
1959
2631
  GRPC_CLOSURE_INIT(&batch->handler_private.closure,
@@ -2012,9 +2684,8 @@ void CallData::DoRetry(grpc_call_element* elem,
2012
2684
  GPR_ASSERT(method_params_ != nullptr);
2013
2685
  const auto* retry_policy = method_params_->retry_policy();
2014
2686
  GPR_ASSERT(retry_policy != nullptr);
2015
- // Reset subchannel call and connected subchannel.
2687
+ // Reset subchannel call.
2016
2688
  subchannel_call_.reset();
2017
- pick_.pick.connected_subchannel.reset();
2018
2689
  // Compute backoff delay.
2019
2690
  grpc_millis next_attempt_time;
2020
2691
  if (server_pushback_ms >= 0) {
@@ -2038,8 +2709,8 @@ void CallData::DoRetry(grpc_call_element* elem,
2038
2709
  this, next_attempt_time - ExecCtx::Get()->Now());
2039
2710
  }
2040
2711
  // Schedule retry after computed delay.
2041
- GRPC_CLOSURE_INIT(&pick_closure_, StartPickLocked, elem,
2042
- grpc_combiner_scheduler(chand->data_plane_combiner()));
2712
+ GRPC_CLOSURE_INIT(&pick_closure_, PickSubchannel, elem,
2713
+ grpc_schedule_on_exec_ctx);
2043
2714
  grpc_timer_init(&retry_timer_, next_attempt_time, &pick_closure_);
2044
2715
  // Update bookkeeping.
2045
2716
  if (retry_state != nullptr) retry_state->retry_dispatched = true;
@@ -2235,7 +2906,8 @@ void CallData::InvokeRecvInitialMetadataCallback(void* arg, grpc_error* error) {
2235
2906
  calld->MaybeClearPendingBatch(batch_data->elem, pending);
2236
2907
  batch_data->Unref();
2237
2908
  // Invoke callback.
2238
- GRPC_CLOSURE_RUN(recv_initial_metadata_ready, GRPC_ERROR_REF(error));
2909
+ Closure::Run(DEBUG_LOCATION, recv_initial_metadata_ready,
2910
+ GRPC_ERROR_REF(error));
2239
2911
  }
2240
2912
 
2241
2913
  void CallData::RecvInitialMetadataReady(void* arg, grpc_error* error) {
@@ -2289,6 +2961,7 @@ void CallData::RecvInitialMetadataReady(void* arg, grpc_error* error) {
2289
2961
  }
2290
2962
  // Received valid initial metadata, so commit the call.
2291
2963
  calld->RetryCommit(elem, retry_state);
2964
+ calld->MaybeInvokeConfigSelectorCommitCallback();
2292
2965
  // Invoke the callback to return the result to the surface.
2293
2966
  // Manually invoking a callback function; it does not take ownership of error.
2294
2967
  calld->InvokeRecvInitialMetadataCallback(batch_data, error);
@@ -2325,7 +2998,7 @@ void CallData::InvokeRecvMessageCallback(void* arg, grpc_error* error) {
2325
2998
  calld->MaybeClearPendingBatch(batch_data->elem, pending);
2326
2999
  batch_data->Unref();
2327
3000
  // Invoke callback.
2328
- GRPC_CLOSURE_RUN(recv_message_ready, GRPC_ERROR_REF(error));
3001
+ Closure::Run(DEBUG_LOCATION, recv_message_ready, GRPC_ERROR_REF(error));
2329
3002
  }
2330
3003
 
2331
3004
  void CallData::RecvMessageReady(void* arg, grpc_error* error) {
@@ -2375,6 +3048,7 @@ void CallData::RecvMessageReady(void* arg, grpc_error* error) {
2375
3048
  }
2376
3049
  // Received a valid message, so commit the call.
2377
3050
  calld->RetryCommit(elem, retry_state);
3051
+ calld->MaybeInvokeConfigSelectorCommitCallback();
2378
3052
  // Invoke the callback to return the result to the surface.
2379
3053
  // Manually invoking a callback function; it does not take ownership of error.
2380
3054
  calld->InvokeRecvMessageCallback(batch_data, error);
@@ -2384,8 +3058,7 @@ void CallData::RecvMessageReady(void* arg, grpc_error* error) {
2384
3058
  // recv_trailing_metadata handling
2385
3059
  //
2386
3060
 
2387
- void CallData::GetCallStatus(grpc_call_element* elem,
2388
- grpc_metadata_batch* md_batch, grpc_error* error,
3061
+ void CallData::GetCallStatus(grpc_metadata_batch* md_batch, grpc_error* error,
2389
3062
  grpc_status_code* status,
2390
3063
  grpc_mdelem** server_pushback_md) {
2391
3064
  if (error != GRPC_ERROR_NONE) {
@@ -2554,7 +3227,7 @@ void CallData::RecvTrailingMetadataReady(void* arg, grpc_error* error) {
2554
3227
  grpc_mdelem* server_pushback_md = nullptr;
2555
3228
  grpc_metadata_batch* md_batch =
2556
3229
  batch_data->batch.payload->recv_trailing_metadata.recv_trailing_metadata;
2557
- calld->GetCallStatus(elem, md_batch, GRPC_ERROR_REF(error), &status,
3230
+ calld->GetCallStatus(md_batch, GRPC_ERROR_REF(error), &status,
2558
3231
  &server_pushback_md);
2559
3232
  if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
2560
3233
  gpr_log(GPR_INFO, "chand=%p calld=%p: call finished, status=%s", chand,
@@ -2577,6 +3250,7 @@ void CallData::RecvTrailingMetadataReady(void* arg, grpc_error* error) {
2577
3250
  }
2578
3251
  // Not retrying, so commit the call.
2579
3252
  calld->RetryCommit(elem, retry_state);
3253
+ calld->MaybeInvokeConfigSelectorCommitCallback();
2580
3254
  // Run any necessary closures.
2581
3255
  calld->RunClosuresForCompletedCall(batch_data, GRPC_ERROR_REF(error));
2582
3256
  }
@@ -2587,8 +3261,7 @@ void CallData::RecvTrailingMetadataReady(void* arg, grpc_error* error) {
2587
3261
 
2588
3262
  void CallData::AddClosuresForCompletedPendingBatch(
2589
3263
  grpc_call_element* elem, SubchannelCallBatchData* batch_data,
2590
- SubchannelCallRetryState* retry_state, grpc_error* error,
2591
- CallCombinerClosureList* closures) {
3264
+ grpc_error* error, CallCombinerClosureList* closures) {
2592
3265
  PendingBatch* pending = PendingBatchFind(
2593
3266
  elem, "completed", [batch_data](grpc_transport_stream_op_batch* batch) {
2594
3267
  // Match the pending batch with the same set of send ops as the
@@ -2655,10 +3328,9 @@ void CallData::OnComplete(void* arg, grpc_error* error) {
2655
3328
  ChannelData* chand = static_cast<ChannelData*>(elem->channel_data);
2656
3329
  CallData* calld = static_cast<CallData*>(elem->call_data);
2657
3330
  if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
2658
- char* batch_str = grpc_transport_stream_op_batch_string(&batch_data->batch);
2659
3331
  gpr_log(GPR_INFO, "chand=%p calld=%p: got on_complete, error=%s, batch=%s",
2660
- chand, calld, grpc_error_string(error), batch_str);
2661
- gpr_free(batch_str);
3332
+ chand, calld, grpc_error_string(error),
3333
+ grpc_transport_stream_op_batch_string(&batch_data->batch).c_str());
2662
3334
  }
2663
3335
  SubchannelCallRetryState* retry_state =
2664
3336
  static_cast<SubchannelCallRetryState*>(
@@ -2686,7 +3358,7 @@ void CallData::OnComplete(void* arg, grpc_error* error) {
2686
3358
  if (!retry_state->retry_dispatched) {
2687
3359
  // Add closure for the completed pending batch, if any.
2688
3360
  calld->AddClosuresForCompletedPendingBatch(
2689
- elem, batch_data, retry_state, GRPC_ERROR_REF(error), &closures);
3361
+ elem, batch_data, GRPC_ERROR_REF(error), &closures);
2690
3362
  // If needed, add a callback to start any replay or pending send ops on
2691
3363
  // the subchannel call.
2692
3364
  if (!retry_state->completed_recv_trailing_metadata) {
@@ -2714,7 +3386,7 @@ void CallData::OnComplete(void* arg, grpc_error* error) {
2714
3386
  // subchannel batch construction
2715
3387
  //
2716
3388
 
2717
- void CallData::StartBatchInCallCombiner(void* arg, grpc_error* ignored) {
3389
+ void CallData::StartBatchInCallCombiner(void* arg, grpc_error* /*ignored*/) {
2718
3390
  grpc_transport_stream_op_batch* batch =
2719
3391
  static_cast<grpc_transport_stream_op_batch*>(arg);
2720
3392
  SubchannelCall* subchannel_call =
@@ -2731,10 +3403,8 @@ void CallData::AddClosureForSubchannelBatch(
2731
3403
  GRPC_CLOSURE_INIT(&batch->handler_private.closure, StartBatchInCallCombiner,
2732
3404
  batch, grpc_schedule_on_exec_ctx);
2733
3405
  if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
2734
- char* batch_str = grpc_transport_stream_op_batch_string(batch);
2735
3406
  gpr_log(GPR_INFO, "chand=%p calld=%p: starting subchannel batch: %s", chand,
2736
- this, batch_str);
2737
- gpr_free(batch_str);
3407
+ this, grpc_transport_stream_op_batch_string(batch).c_str());
2738
3408
  }
2739
3409
  closures->Add(&batch->handler_private.closure, GRPC_ERROR_NONE,
2740
3410
  "start_subchannel_batch");
@@ -2744,8 +3414,8 @@ void CallData::AddRetriableSendInitialMetadataOp(
2744
3414
  SubchannelCallRetryState* retry_state,
2745
3415
  SubchannelCallBatchData* batch_data) {
2746
3416
  // Maps the number of retries to the corresponding metadata value slice.
2747
- static const grpc_slice* retry_count_strings[] = {
2748
- &GRPC_MDSTR_1, &GRPC_MDSTR_2, &GRPC_MDSTR_3, &GRPC_MDSTR_4};
3417
+ const grpc_slice* retry_count_strings[] = {&GRPC_MDSTR_1, &GRPC_MDSTR_2,
3418
+ &GRPC_MDSTR_3, &GRPC_MDSTR_4};
2749
3419
  // We need to make a copy of the metadata batch for each attempt, since
2750
3420
  // the filters in the subchannel stack may modify this batch, and we don't
2751
3421
  // want those modifications to be passed forward to subsequent attempts.
@@ -2762,8 +3432,7 @@ void CallData::AddRetriableSendInitialMetadataOp(
2762
3432
  if (GPR_UNLIKELY(retry_state->send_initial_metadata.idx.named
2763
3433
  .grpc_previous_rpc_attempts != nullptr)) {
2764
3434
  grpc_metadata_batch_remove(&retry_state->send_initial_metadata,
2765
- retry_state->send_initial_metadata.idx.named
2766
- .grpc_previous_rpc_attempts);
3435
+ GRPC_BATCH_GRPC_PREVIOUS_RPC_ATTEMPTS);
2767
3436
  }
2768
3437
  if (GPR_UNLIKELY(num_attempts_completed_ > 0)) {
2769
3438
  grpc_mdelem retry_md = grpc_mdelem_create(
@@ -2773,7 +3442,7 @@ void CallData::AddRetriableSendInitialMetadataOp(
2773
3442
  &retry_state->send_initial_metadata,
2774
3443
  &retry_state
2775
3444
  ->send_initial_metadata_storage[send_initial_metadata_.list.count],
2776
- retry_md);
3445
+ retry_md, GRPC_BATCH_GRPC_PREVIOUS_RPC_ATTEMPTS);
2777
3446
  if (GPR_UNLIKELY(error != GRPC_ERROR_NONE)) {
2778
3447
  gpr_log(GPR_ERROR, "error adding retry metadata: %s",
2779
3448
  grpc_error_string(error));
@@ -2871,7 +3540,7 @@ void CallData::AddRetriableRecvTrailingMetadataOp(
2871
3540
  .recv_trailing_metadata_ready =
2872
3541
  &retry_state->recv_trailing_metadata_ready;
2873
3542
  MaybeInjectRecvTrailingMetadataReadyForLoadBalancingPolicy(
2874
- pick_.pick, &batch_data->batch);
3543
+ &batch_data->batch);
2875
3544
  }
2876
3545
 
2877
3546
  void CallData::StartInternalRecvTrailingMetadata(grpc_call_element* elem) {
@@ -3085,7 +3754,8 @@ void CallData::AddSubchannelBatchesForPendingBatches(
3085
3754
  }
3086
3755
  }
3087
3756
 
3088
- void CallData::StartRetriableSubchannelBatches(void* arg, grpc_error* ignored) {
3757
+ void CallData::StartRetriableSubchannelBatches(void* arg,
3758
+ grpc_error* /*ignored*/) {
3089
3759
  grpc_call_element* elem = static_cast<grpc_call_element*>(arg);
3090
3760
  ChannelData* chand = static_cast<ChannelData*>(elem->channel_data);
3091
3761
  CallData* calld = static_cast<CallData*>(elem->call_data);
@@ -3132,14 +3802,14 @@ void CallData::CreateSubchannelCall(grpc_call_element* elem) {
3132
3802
  ChannelData* chand = static_cast<ChannelData*>(elem->channel_data);
3133
3803
  const size_t parent_data_size =
3134
3804
  enable_retries_ ? sizeof(SubchannelCallRetryState) : 0;
3135
- const ConnectedSubchannel::CallArgs call_args = {
3136
- pollent_, path_, call_start_time_, deadline_, arena_,
3805
+ SubchannelCall::Args call_args = {
3806
+ std::move(connected_subchannel_), pollent_, path_, call_start_time_,
3807
+ deadline_, arena_,
3137
3808
  // TODO(roth): When we implement hedging support, we will probably
3138
3809
  // need to use a separate call context for each subchannel call.
3139
3810
  call_context_, call_combiner_, parent_data_size};
3140
3811
  grpc_error* error = GRPC_ERROR_NONE;
3141
- subchannel_call_ =
3142
- pick_.pick.connected_subchannel->CreateCall(call_args, &error);
3812
+ subchannel_call_ = SubchannelCall::Create(std::move(call_args), &error);
3143
3813
  if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
3144
3814
  gpr_log(GPR_INFO, "chand=%p calld=%p: create subchannel_call=%p: error=%s",
3145
3815
  chand, this, subchannel_call_.get(), grpc_error_string(error));
@@ -3155,6 +3825,11 @@ void CallData::CreateSubchannelCall(grpc_call_element* elem) {
3155
3825
  }
3156
3826
  }
3157
3827
 
3828
+ void CallData::AsyncPickDone(grpc_call_element* elem, grpc_error* error) {
3829
+ GRPC_CLOSURE_INIT(&pick_closure_, PickDone, elem, grpc_schedule_on_exec_ctx);
3830
+ ExecCtx::Run(DEBUG_LOCATION, &pick_closure_, error);
3831
+ }
3832
+
3158
3833
  void CallData::PickDone(void* arg, grpc_error* error) {
3159
3834
  grpc_call_element* elem = static_cast<grpc_call_element*>(arg);
3160
3835
  ChannelData* chand = static_cast<ChannelData*>(elem->channel_data);
@@ -3177,10 +3852,9 @@ class CallData::QueuedPickCanceller {
3177
3852
  public:
3178
3853
  explicit QueuedPickCanceller(grpc_call_element* elem) : elem_(elem) {
3179
3854
  auto* calld = static_cast<CallData*>(elem->call_data);
3180
- auto* chand = static_cast<ChannelData*>(elem->channel_data);
3181
3855
  GRPC_CALL_STACK_REF(calld->owning_call_, "QueuedPickCanceller");
3182
3856
  GRPC_CLOSURE_INIT(&closure_, &CancelLocked, this,
3183
- grpc_combiner_scheduler(chand->data_plane_combiner()));
3857
+ grpc_schedule_on_exec_ctx);
3184
3858
  calld->call_combiner_->SetNotifyOnCancel(&closure_);
3185
3859
  }
3186
3860
 
@@ -3189,6 +3863,7 @@ class CallData::QueuedPickCanceller {
3189
3863
  auto* self = static_cast<QueuedPickCanceller*>(arg);
3190
3864
  auto* chand = static_cast<ChannelData*>(self->elem_->channel_data);
3191
3865
  auto* calld = static_cast<CallData*>(self->elem_->call_data);
3866
+ MutexLock lock(chand->data_plane_mu());
3192
3867
  if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
3193
3868
  gpr_log(GPR_INFO,
3194
3869
  "chand=%p calld=%p: cancelling queued pick: "
@@ -3198,20 +3873,21 @@ class CallData::QueuedPickCanceller {
3198
3873
  }
3199
3874
  if (calld->pick_canceller_ == self && error != GRPC_ERROR_NONE) {
3200
3875
  // Remove pick from list of queued picks.
3201
- calld->RemoveCallFromQueuedPicksLocked(self->elem_);
3876
+ calld->MaybeRemoveCallFromQueuedPicksLocked(self->elem_);
3202
3877
  // Fail pending batches on the call.
3203
3878
  calld->PendingBatchesFail(self->elem_, GRPC_ERROR_REF(error),
3204
3879
  YieldCallCombinerIfPendingBatchesFound);
3205
3880
  }
3206
3881
  GRPC_CALL_STACK_UNREF(calld->owning_call_, "QueuedPickCanceller");
3207
- Delete(self);
3882
+ delete self;
3208
3883
  }
3209
3884
 
3210
3885
  grpc_call_element* elem_;
3211
3886
  grpc_closure closure_;
3212
3887
  };
3213
3888
 
3214
- void CallData::RemoveCallFromQueuedPicksLocked(grpc_call_element* elem) {
3889
+ void CallData::MaybeRemoveCallFromQueuedPicksLocked(grpc_call_element* elem) {
3890
+ if (!pick_queued_) return;
3215
3891
  auto* chand = static_cast<ChannelData*>(elem->channel_data);
3216
3892
  if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
3217
3893
  gpr_log(GPR_INFO, "chand=%p calld=%p: removing from queued picks list",
@@ -3223,7 +3899,8 @@ void CallData::RemoveCallFromQueuedPicksLocked(grpc_call_element* elem) {
3223
3899
  pick_canceller_ = nullptr;
3224
3900
  }
3225
3901
 
3226
- void CallData::AddCallToQueuedPicksLocked(grpc_call_element* elem) {
3902
+ void CallData::MaybeAddCallToQueuedPicksLocked(grpc_call_element* elem) {
3903
+ if (pick_queued_) return;
3227
3904
  auto* chand = static_cast<ChannelData*>(elem->channel_data);
3228
3905
  if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
3229
3906
  gpr_log(GPR_INFO, "chand=%p calld=%p: adding to queued picks list", chand,
@@ -3233,91 +3910,179 @@ void CallData::AddCallToQueuedPicksLocked(grpc_call_element* elem) {
3233
3910
  pick_.elem = elem;
3234
3911
  chand->AddQueuedPick(&pick_, pollent_);
3235
3912
  // Register call combiner cancellation callback.
3236
- pick_canceller_ = New<QueuedPickCanceller>(elem);
3913
+ pick_canceller_ = new QueuedPickCanceller(elem);
3237
3914
  }
3238
3915
 
3239
- void CallData::ApplyServiceConfigToCallLocked(grpc_call_element* elem) {
3916
+ grpc_error* CallData::ApplyServiceConfigToCallLocked(
3917
+ grpc_call_element* elem, grpc_metadata_batch* initial_metadata) {
3240
3918
  ChannelData* chand = static_cast<ChannelData*>(elem->channel_data);
3241
3919
  if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
3242
3920
  gpr_log(GPR_INFO, "chand=%p calld=%p: applying service config to call",
3243
3921
  chand, this);
3244
3922
  }
3245
- // Store a ref to the service_config in service_config_call_data_. Also, save
3246
- // a pointer to this in the call_context so that all future filters can access
3247
- // it.
3248
- service_config_call_data_ =
3249
- ServiceConfig::CallData(chand->service_config(), path_);
3250
- if (service_config_call_data_.service_config() != nullptr) {
3251
- call_context_[GRPC_SERVICE_CONFIG_CALL_DATA].value =
3252
- &service_config_call_data_;
3253
- method_params_ = static_cast<ClientChannelMethodParsedObject*>(
3254
- service_config_call_data_.GetMethodParsedObject(
3923
+ ConfigSelector* config_selector = chand->config_selector();
3924
+ auto service_config = chand->service_config();
3925
+ if (service_config != nullptr) {
3926
+ // Use the ConfigSelector to determine the config for the call.
3927
+ ConfigSelector::CallConfig call_config =
3928
+ config_selector->GetCallConfig({&path_, initial_metadata, arena_});
3929
+ if (call_config.error != GRPC_ERROR_NONE) return call_config.error;
3930
+ call_attributes_ = std::move(call_config.call_attributes);
3931
+ on_call_committed_ = std::move(call_config.on_call_committed);
3932
+ // Create a ServiceConfigCallData for the call. This stores a ref to the
3933
+ // ServiceConfig and caches the right set of parsed configs to use for
3934
+ // the call. The MethodConfig will store itself in the call context,
3935
+ // so that it can be accessed by filters in the subchannel, and it
3936
+ // will be cleaned up when the call ends.
3937
+ auto* service_config_call_data = arena_->New<ServiceConfigCallData>(
3938
+ std::move(service_config), call_config.method_configs, call_context_);
3939
+ // Apply our own method params to the call.
3940
+ method_params_ = static_cast<ClientChannelMethodParsedConfig*>(
3941
+ service_config_call_data->GetMethodParsedConfig(
3255
3942
  internal::ClientChannelServiceConfigParser::ParserIndex()));
3256
- }
3257
- retry_throttle_data_ = chand->retry_throttle_data();
3258
- if (method_params_ != nullptr) {
3259
- // If the deadline from the service config is shorter than the one
3260
- // from the client API, reset the deadline timer.
3261
- if (chand->deadline_checking_enabled() && method_params_->timeout() != 0) {
3262
- const grpc_millis per_method_deadline =
3263
- grpc_timespec_to_millis_round_up(call_start_time_) +
3264
- method_params_->timeout();
3265
- if (per_method_deadline < deadline_) {
3266
- deadline_ = per_method_deadline;
3267
- grpc_deadline_state_reset(elem, deadline_);
3943
+ if (method_params_ != nullptr) {
3944
+ // If the deadline from the service config is shorter than the one
3945
+ // from the client API, reset the deadline timer.
3946
+ if (chand->deadline_checking_enabled() &&
3947
+ method_params_->timeout() != 0) {
3948
+ const grpc_millis per_method_deadline =
3949
+ grpc_cycle_counter_to_millis_round_up(call_start_time_) +
3950
+ method_params_->timeout();
3951
+ if (per_method_deadline < deadline_) {
3952
+ deadline_ = per_method_deadline;
3953
+ grpc_deadline_state_reset(elem, deadline_);
3954
+ }
3268
3955
  }
3269
- }
3270
- // If the service config set wait_for_ready and the application
3271
- // did not explicitly set it, use the value from the service config.
3272
- uint32_t* send_initial_metadata_flags =
3273
- &pending_batches_[0]
3274
- .batch->payload->send_initial_metadata.send_initial_metadata_flags;
3275
- if (method_params_->wait_for_ready().has_value() &&
3276
- !(*send_initial_metadata_flags &
3277
- GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET)) {
3278
- if (method_params_->wait_for_ready().value()) {
3279
- *send_initial_metadata_flags |= GRPC_INITIAL_METADATA_WAIT_FOR_READY;
3280
- } else {
3281
- *send_initial_metadata_flags &= ~GRPC_INITIAL_METADATA_WAIT_FOR_READY;
3956
+ // If the service config set wait_for_ready and the application
3957
+ // did not explicitly set it, use the value from the service config.
3958
+ uint32_t* send_initial_metadata_flags =
3959
+ &pending_batches_[0]
3960
+ .batch->payload->send_initial_metadata
3961
+ .send_initial_metadata_flags;
3962
+ if (method_params_->wait_for_ready().has_value() &&
3963
+ !(*send_initial_metadata_flags &
3964
+ GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET)) {
3965
+ if (method_params_->wait_for_ready().value()) {
3966
+ *send_initial_metadata_flags |= GRPC_INITIAL_METADATA_WAIT_FOR_READY;
3967
+ } else {
3968
+ *send_initial_metadata_flags &= ~GRPC_INITIAL_METADATA_WAIT_FOR_READY;
3969
+ }
3282
3970
  }
3283
3971
  }
3972
+ // Set retry throttle data for call.
3973
+ retry_throttle_data_ = chand->retry_throttle_data();
3284
3974
  }
3285
3975
  // If no retry policy, disable retries.
3286
3976
  // TODO(roth): Remove this when adding support for transparent retries.
3287
3977
  if (method_params_ == nullptr || method_params_->retry_policy() == nullptr) {
3288
3978
  enable_retries_ = false;
3289
3979
  }
3980
+ return GRPC_ERROR_NONE;
3290
3981
  }
3291
3982
 
3292
- void CallData::MaybeApplyServiceConfigToCallLocked(grpc_call_element* elem) {
3293
- ChannelData* chand = static_cast<ChannelData*>(elem->channel_data);
3294
- // Apply service config data to the call only once, and only if the
3295
- // channel has the data available.
3296
- if (GPR_LIKELY(chand->received_service_config_data() &&
3297
- !service_config_applied_)) {
3298
- service_config_applied_ = true;
3299
- ApplyServiceConfigToCallLocked(elem);
3983
+ void CallData::MaybeInvokeConfigSelectorCommitCallback() {
3984
+ if (on_call_committed_ != nullptr) {
3985
+ on_call_committed_();
3986
+ on_call_committed_ = nullptr;
3300
3987
  }
3301
3988
  }
3302
3989
 
3303
- const char* PickResultName(LoadBalancingPolicy::PickResult result) {
3304
- switch (result) {
3305
- case LoadBalancingPolicy::PICK_COMPLETE:
3990
+ const char* PickResultTypeName(
3991
+ LoadBalancingPolicy::PickResult::ResultType type) {
3992
+ switch (type) {
3993
+ case LoadBalancingPolicy::PickResult::PICK_COMPLETE:
3306
3994
  return "COMPLETE";
3307
- case LoadBalancingPolicy::PICK_QUEUE:
3995
+ case LoadBalancingPolicy::PickResult::PICK_QUEUE:
3308
3996
  return "QUEUE";
3309
- case LoadBalancingPolicy::PICK_TRANSIENT_FAILURE:
3310
- return "TRANSIENT_FAILURE";
3997
+ case LoadBalancingPolicy::PickResult::PICK_FAILED:
3998
+ return "FAILED";
3311
3999
  }
3312
4000
  GPR_UNREACHABLE_CODE(return "UNKNOWN");
3313
4001
  }
3314
4002
 
3315
- void CallData::StartPickLocked(void* arg, grpc_error* error) {
4003
+ void CallData::PickSubchannel(void* arg, grpc_error* error) {
3316
4004
  grpc_call_element* elem = static_cast<grpc_call_element*>(arg);
3317
4005
  CallData* calld = static_cast<CallData*>(elem->call_data);
3318
4006
  ChannelData* chand = static_cast<ChannelData*>(elem->channel_data);
3319
- GPR_ASSERT(calld->pick_.pick.connected_subchannel == nullptr);
3320
- GPR_ASSERT(calld->subchannel_call_ == nullptr);
4007
+ bool pick_complete;
4008
+ {
4009
+ MutexLock lock(chand->data_plane_mu());
4010
+ pick_complete = calld->PickSubchannelLocked(elem, &error);
4011
+ }
4012
+ if (pick_complete) {
4013
+ PickDone(elem, error);
4014
+ GRPC_ERROR_UNREF(error);
4015
+ }
4016
+ }
4017
+
4018
+ bool CallData::PickSubchannelLocked(grpc_call_element* elem,
4019
+ grpc_error** error) {
4020
+ ChannelData* chand = static_cast<ChannelData*>(elem->channel_data);
4021
+ GPR_ASSERT(connected_subchannel_ == nullptr);
4022
+ GPR_ASSERT(subchannel_call_ == nullptr);
4023
+ // The picker being null means that the channel is currently in IDLE state.
4024
+ // The incoming call will make the channel exit IDLE.
4025
+ if (chand->picker() == nullptr) {
4026
+ GRPC_CHANNEL_STACK_REF(chand->owning_stack(), "PickSubchannelLocked");
4027
+ // Bounce into the control plane work serializer to exit IDLE. Since we are
4028
+ // holding on to the data plane mutex here, we offload it on the ExecCtx so
4029
+ // that we don't deadlock with ourselves.
4030
+ ExecCtx::Run(
4031
+ DEBUG_LOCATION,
4032
+ GRPC_CLOSURE_CREATE(
4033
+ [](void* arg, grpc_error* /*error*/) {
4034
+ auto* chand = static_cast<ChannelData*>(arg);
4035
+ chand->work_serializer()->Run(
4036
+ [chand]() {
4037
+ chand->CheckConnectivityState(/*try_to_connect=*/true);
4038
+ GRPC_CHANNEL_STACK_UNREF(chand->owning_stack(),
4039
+ "PickSubchannelLocked");
4040
+ },
4041
+ DEBUG_LOCATION);
4042
+ },
4043
+ chand, nullptr),
4044
+ GRPC_ERROR_NONE);
4045
+ // Queue the pick, so that it will be attempted once the channel
4046
+ // becomes connected.
4047
+ MaybeAddCallToQueuedPicksLocked(elem);
4048
+ return false;
4049
+ }
4050
+ grpc_metadata_batch* initial_metadata_batch =
4051
+ seen_send_initial_metadata_
4052
+ ? &send_initial_metadata_
4053
+ : pending_batches_[0]
4054
+ .batch->payload->send_initial_metadata.send_initial_metadata;
4055
+ // Grab initial metadata flags so that we can check later if the call has
4056
+ // wait_for_ready enabled.
4057
+ const uint32_t send_initial_metadata_flags =
4058
+ seen_send_initial_metadata_ ? send_initial_metadata_flags_
4059
+ : pending_batches_[0]
4060
+ .batch->payload->send_initial_metadata
4061
+ .send_initial_metadata_flags;
4062
+ // Avoid picking if we haven't yet received service config data.
4063
+ if (GPR_UNLIKELY(!chand->received_service_config_data())) {
4064
+ // If the resolver returned transient failure before returning the
4065
+ // first service config, fail any non-wait_for_ready calls.
4066
+ grpc_error* resolver_error = chand->resolver_transient_failure_error();
4067
+ if (resolver_error != GRPC_ERROR_NONE &&
4068
+ (send_initial_metadata_flags & GRPC_INITIAL_METADATA_WAIT_FOR_READY) ==
4069
+ 0) {
4070
+ MaybeRemoveCallFromQueuedPicksLocked(elem);
4071
+ *error = GRPC_ERROR_REF(resolver_error);
4072
+ return true;
4073
+ }
4074
+ // Either the resolver has not yet returned a result, or it has
4075
+ // returned transient failure but the call is wait_for_ready. In
4076
+ // either case, queue the call.
4077
+ MaybeAddCallToQueuedPicksLocked(elem);
4078
+ return false;
4079
+ }
4080
+ // Apply service config to call if not yet applied.
4081
+ if (GPR_LIKELY(!service_config_applied_)) {
4082
+ service_config_applied_ = true;
4083
+ *error = ApplyServiceConfigToCallLocked(elem, initial_metadata_batch);
4084
+ if (*error != GRPC_ERROR_NONE) return true;
4085
+ }
3321
4086
  // If this is a retry, use the send_initial_metadata payload that
3322
4087
  // we've cached; otherwise, use the pending batch. The
3323
4088
  // send_initial_metadata batch will be the first pending batch in the
@@ -3328,79 +4093,80 @@ void CallData::StartPickLocked(void* arg, grpc_error* error) {
3328
4093
  // allocate the subchannel batch earlier so that we can give the
3329
4094
  // subchannel's copy of the metadata batch (which is copied for each
3330
4095
  // attempt) to the LB policy instead the one from the parent channel.
3331
- calld->pick_.pick.initial_metadata =
3332
- calld->seen_send_initial_metadata_
3333
- ? &calld->send_initial_metadata_
3334
- : calld->pending_batches_[0]
3335
- .batch->payload->send_initial_metadata.send_initial_metadata;
3336
- uint32_t* send_initial_metadata_flags =
3337
- calld->seen_send_initial_metadata_
3338
- ? &calld->send_initial_metadata_flags_
3339
- : &calld->pending_batches_[0]
3340
- .batch->payload->send_initial_metadata
3341
- .send_initial_metadata_flags;
3342
- // Apply service config to call if needed.
3343
- calld->MaybeApplyServiceConfigToCallLocked(elem);
3344
- // When done, we schedule this closure to leave the data plane combiner.
3345
- GRPC_CLOSURE_INIT(&calld->pick_closure_, PickDone, elem,
3346
- grpc_schedule_on_exec_ctx);
4096
+ LoadBalancingPolicy::PickArgs pick_args;
4097
+ pick_args.path = StringViewFromSlice(path_);
4098
+ pick_args.call_state = &lb_call_state_;
4099
+ Metadata initial_metadata(this, initial_metadata_batch);
4100
+ pick_args.initial_metadata = &initial_metadata;
3347
4101
  // Attempt pick.
3348
- error = GRPC_ERROR_NONE;
3349
- auto pick_result = chand->picker()->Pick(&calld->pick_.pick, &error);
4102
+ auto result = chand->picker()->Pick(pick_args);
3350
4103
  if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
3351
4104
  gpr_log(GPR_INFO,
3352
- "chand=%p calld=%p: LB pick returned %s (connected_subchannel=%p, "
3353
- "error=%s)",
3354
- chand, calld, PickResultName(pick_result),
3355
- calld->pick_.pick.connected_subchannel.get(),
3356
- grpc_error_string(error));
3357
- }
3358
- switch (pick_result) {
3359
- case LoadBalancingPolicy::PICK_TRANSIENT_FAILURE: {
4105
+ "chand=%p calld=%p: LB pick returned %s (subchannel=%p, error=%s)",
4106
+ chand, this, PickResultTypeName(result.type),
4107
+ result.subchannel.get(), grpc_error_string(result.error));
4108
+ }
4109
+ switch (result.type) {
4110
+ case LoadBalancingPolicy::PickResult::PICK_FAILED: {
3360
4111
  // If we're shutting down, fail all RPCs.
3361
4112
  grpc_error* disconnect_error = chand->disconnect_error();
3362
4113
  if (disconnect_error != GRPC_ERROR_NONE) {
3363
- GRPC_ERROR_UNREF(error);
3364
- GRPC_CLOSURE_SCHED(&calld->pick_closure_,
3365
- GRPC_ERROR_REF(disconnect_error));
3366
- break;
4114
+ GRPC_ERROR_UNREF(result.error);
4115
+ MaybeRemoveCallFromQueuedPicksLocked(elem);
4116
+ MaybeInvokeConfigSelectorCommitCallback();
4117
+ *error = GRPC_ERROR_REF(disconnect_error);
4118
+ return true;
3367
4119
  }
3368
4120
  // If wait_for_ready is false, then the error indicates the RPC
3369
4121
  // attempt's final status.
3370
- if ((*send_initial_metadata_flags &
4122
+ if ((send_initial_metadata_flags &
3371
4123
  GRPC_INITIAL_METADATA_WAIT_FOR_READY) == 0) {
3372
4124
  // Retry if appropriate; otherwise, fail.
3373
4125
  grpc_status_code status = GRPC_STATUS_OK;
3374
- grpc_error_get_status(error, calld->deadline_, &status, nullptr,
4126
+ grpc_error_get_status(result.error, deadline_, &status, nullptr,
3375
4127
  nullptr, nullptr);
3376
- if (!calld->enable_retries_ ||
3377
- !calld->MaybeRetry(elem, nullptr /* batch_data */, status,
3378
- nullptr /* server_pushback_md */)) {
4128
+ const bool retried = enable_retries_ &&
4129
+ MaybeRetry(elem, nullptr /* batch_data */, status,
4130
+ nullptr /* server_pushback_md */);
4131
+ if (!retried) {
3379
4132
  grpc_error* new_error =
3380
4133
  GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
3381
- "Failed to pick subchannel", &error, 1);
3382
- GRPC_ERROR_UNREF(error);
3383
- GRPC_CLOSURE_SCHED(&calld->pick_closure_, new_error);
4134
+ "Failed to pick subchannel", &result.error, 1);
4135
+ GRPC_ERROR_UNREF(result.error);
4136
+ *error = new_error;
4137
+ MaybeInvokeConfigSelectorCommitCallback();
3384
4138
  }
3385
- if (calld->pick_queued_) calld->RemoveCallFromQueuedPicksLocked(elem);
3386
- break;
4139
+ MaybeRemoveCallFromQueuedPicksLocked(elem);
4140
+ return !retried;
3387
4141
  }
3388
4142
  // If wait_for_ready is true, then queue to retry when we get a new
3389
4143
  // picker.
3390
- GRPC_ERROR_UNREF(error);
4144
+ GRPC_ERROR_UNREF(result.error);
3391
4145
  }
3392
4146
  // Fallthrough
3393
- case LoadBalancingPolicy::PICK_QUEUE:
3394
- if (!calld->pick_queued_) calld->AddCallToQueuedPicksLocked(elem);
3395
- break;
4147
+ case LoadBalancingPolicy::PickResult::PICK_QUEUE:
4148
+ MaybeAddCallToQueuedPicksLocked(elem);
4149
+ return false;
3396
4150
  default: // PICK_COMPLETE
4151
+ MaybeRemoveCallFromQueuedPicksLocked(elem);
3397
4152
  // Handle drops.
3398
- if (GPR_UNLIKELY(calld->pick_.pick.connected_subchannel == nullptr)) {
3399
- error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
3400
- "Call dropped by load balancing policy");
4153
+ if (GPR_UNLIKELY(result.subchannel == nullptr)) {
4154
+ result.error = grpc_error_set_int(
4155
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING(
4156
+ "Call dropped by load balancing policy"),
4157
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
4158
+ MaybeInvokeConfigSelectorCommitCallback();
4159
+ } else {
4160
+ // Grab a ref to the connected subchannel while we're still
4161
+ // holding the data plane mutex.
4162
+ connected_subchannel_ =
4163
+ chand->GetConnectedSubchannelInDataPlane(result.subchannel.get());
4164
+ GPR_ASSERT(connected_subchannel_ != nullptr);
4165
+ if (retry_committed_) MaybeInvokeConfigSelectorCommitCallback();
3401
4166
  }
3402
- GRPC_CLOSURE_SCHED(&calld->pick_closure_, error);
3403
- if (calld->pick_queued_) calld->RemoveCallFromQueuedPicksLocked(elem);
4167
+ lb_recv_trailing_metadata_ready_ = result.recv_trailing_metadata_ready;
4168
+ *error = result.error;
4169
+ return true;
3404
4170
  }
3405
4171
  }
3406
4172
 
@@ -3428,20 +4194,6 @@ const grpc_channel_filter grpc_client_channel_filter = {
3428
4194
  "client-channel",
3429
4195
  };
3430
4196
 
3431
- void grpc_client_channel_set_channelz_node(
3432
- grpc_channel_element* elem, grpc_core::channelz::ClientChannelNode* node) {
3433
- auto* chand = static_cast<ChannelData*>(elem->channel_data);
3434
- chand->set_channelz_node(node);
3435
- }
3436
-
3437
- void grpc_client_channel_populate_child_refs(
3438
- grpc_channel_element* elem,
3439
- grpc_core::channelz::ChildRefsList* child_subchannels,
3440
- grpc_core::channelz::ChildRefsList* child_channels) {
3441
- auto* chand = static_cast<ChannelData*>(elem->channel_data);
3442
- chand->FillChildRefsForChannelz(child_subchannels, child_channels);
3443
- }
3444
-
3445
4197
  grpc_connectivity_state grpc_client_channel_check_connectivity_state(
3446
4198
  grpc_channel_element* elem, int try_to_connect) {
3447
4199
  auto* chand = static_cast<ChannelData*>(elem->channel_data);
@@ -3459,10 +4211,32 @@ void grpc_client_channel_watch_connectivity_state(
3459
4211
  grpc_connectivity_state* state, grpc_closure* closure,
3460
4212
  grpc_closure* watcher_timer_init) {
3461
4213
  auto* chand = static_cast<ChannelData*>(elem->channel_data);
4214
+ if (state == nullptr) {
4215
+ // Handle cancellation.
4216
+ GPR_ASSERT(watcher_timer_init == nullptr);
4217
+ chand->RemoveExternalConnectivityWatcher(closure, /*cancel=*/true);
4218
+ return;
4219
+ }
4220
+ // Handle addition.
3462
4221
  return chand->AddExternalConnectivityWatcher(pollent, state, closure,
3463
4222
  watcher_timer_init);
3464
4223
  }
3465
4224
 
4225
+ void grpc_client_channel_start_connectivity_watch(
4226
+ grpc_channel_element* elem, grpc_connectivity_state initial_state,
4227
+ grpc_core::OrphanablePtr<grpc_core::AsyncConnectivityStateWatcherInterface>
4228
+ watcher) {
4229
+ auto* chand = static_cast<ChannelData*>(elem->channel_data);
4230
+ chand->AddConnectivityWatcher(initial_state, std::move(watcher));
4231
+ }
4232
+
4233
+ void grpc_client_channel_stop_connectivity_watch(
4234
+ grpc_channel_element* elem,
4235
+ grpc_core::AsyncConnectivityStateWatcherInterface* watcher) {
4236
+ auto* chand = static_cast<ChannelData*>(elem->channel_data);
4237
+ chand->RemoveConnectivityWatcher(watcher);
4238
+ }
4239
+
3466
4240
  grpc_core::RefCountedPtr<grpc_core::SubchannelCall>
3467
4241
  grpc_client_channel_get_subchannel_call(grpc_call_element* elem) {
3468
4242
  auto* calld = static_cast<CallData*>(elem->call_data);