grpc 1.28.0.pre2 → 1.31.0.pre1

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 (660) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +8313 -11862
  3. data/include/grpc/grpc.h +2 -2
  4. data/include/grpc/grpc_security.h +30 -9
  5. data/include/grpc/grpc_security_constants.h +4 -0
  6. data/include/grpc/impl/codegen/grpc_types.h +23 -23
  7. data/include/grpc/impl/codegen/port_platform.h +6 -34
  8. data/include/grpc/module.modulemap +24 -39
  9. data/src/core/ext/filters/client_channel/backend_metric.cc +18 -12
  10. data/src/core/ext/filters/client_channel/client_channel.cc +618 -482
  11. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +3 -2
  12. data/src/core/ext/filters/client_channel/config_selector.cc +62 -0
  13. data/src/core/ext/filters/client_channel/config_selector.h +93 -0
  14. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +24 -2
  15. data/src/core/ext/filters/client_channel/health/health_check_client.cc +9 -22
  16. data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
  17. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +6 -5
  18. data/src/core/ext/filters/client_channel/http_proxy.cc +23 -14
  19. data/src/core/ext/filters/client_channel/lb_policy.cc +19 -18
  20. data/src/core/ext/filters/client_channel/lb_policy.h +44 -33
  21. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +83 -0
  22. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +99 -0
  23. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +297 -0
  24. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +83 -0
  25. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +311 -497
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +89 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +40 -0
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +11 -9
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +3 -2
  30. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +871 -0
  31. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +1 -1
  32. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +9 -17
  33. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +734 -0
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +117 -41
  35. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +938 -0
  36. data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +528 -0
  37. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -2
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +1142 -0
  39. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +10 -7
  40. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +2 -1
  41. data/src/core/ext/filters/client_channel/parse_address.cc +22 -21
  42. data/src/core/ext/filters/client_channel/resolver.cc +5 -8
  43. data/src/core/ext/filters/client_channel/resolver.h +12 -14
  44. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +78 -61
  45. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +41 -40
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +8 -7
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +22 -24
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +12 -10
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +79 -122
  50. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +199 -163
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -3
  52. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +7 -4
  53. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +46 -45
  54. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +93 -102
  55. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +0 -4
  56. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +2 -2
  57. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +64 -12
  58. data/src/core/ext/filters/client_channel/resolver_factory.h +2 -2
  59. data/src/core/ext/filters/client_channel/resolver_registry.cc +19 -17
  60. data/src/core/ext/filters/client_channel/resolver_registry.h +8 -8
  61. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +21 -22
  62. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +19 -16
  63. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +73 -217
  64. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +45 -27
  65. data/src/core/ext/filters/client_channel/server_address.cc +6 -9
  66. data/src/core/ext/filters/client_channel/server_address.h +6 -12
  67. data/src/core/ext/filters/client_channel/service_config.cc +104 -144
  68. data/src/core/ext/filters/client_channel/service_config.h +28 -98
  69. data/src/core/ext/filters/client_channel/service_config_call_data.h +68 -0
  70. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +142 -0
  71. data/src/core/ext/filters/client_channel/service_config_parser.cc +87 -0
  72. data/src/core/ext/filters/client_channel/service_config_parser.h +89 -0
  73. data/src/core/ext/filters/client_channel/subchannel.cc +55 -25
  74. data/src/core/ext/filters/client_channel/subchannel.h +35 -11
  75. data/src/core/ext/filters/client_channel/xds/xds_api.cc +1200 -246
  76. data/src/core/ext/filters/client_channel/xds/xds_api.h +130 -44
  77. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +90 -29
  78. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +9 -4
  79. data/src/core/ext/filters/client_channel/xds/xds_channel_secure.cc +4 -2
  80. data/src/core/ext/filters/client_channel/xds/xds_client.cc +839 -431
  81. data/src/core/ext/filters/client_channel/xds/xds_client.h +84 -33
  82. data/src/core/ext/filters/client_channel/xds/xds_client_stats.cc +11 -12
  83. data/src/core/ext/filters/client_channel/xds/xds_client_stats.h +40 -28
  84. data/src/core/ext/filters/http/client/http_client_filter.cc +28 -33
  85. data/src/core/ext/filters/http/client_authority_filter.cc +4 -4
  86. data/src/core/ext/filters/http/http_filters_plugin.cc +28 -12
  87. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +258 -221
  88. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +399 -0
  89. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +31 -0
  90. data/src/core/ext/filters/message_size/message_size_filter.cc +61 -88
  91. data/src/core/ext/filters/message_size/message_size_filter.h +10 -4
  92. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +386 -350
  93. data/src/core/ext/transport/chttp2/server/chttp2_server.h +6 -2
  94. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +1 -1
  95. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +7 -13
  96. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +7 -8
  97. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +4 -6
  98. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +42 -26
  99. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -0
  100. data/src/core/ext/transport/chttp2/transport/flow_control.cc +25 -30
  101. data/src/core/ext/transport/chttp2/transport/flow_control.h +14 -16
  102. data/src/core/ext/transport/chttp2/transport/frame_data.cc +9 -12
  103. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +4 -6
  104. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +2 -3
  105. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -6
  106. data/src/core/ext/transport/chttp2/transport/frame_ping.h +2 -3
  107. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +12 -13
  108. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -3
  109. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -7
  110. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -3
  111. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +9 -12
  112. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +2 -3
  113. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +29 -16
  114. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +2 -3
  115. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +25 -29
  116. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -3
  117. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +13 -17
  118. data/src/core/ext/transport/chttp2/transport/hpack_table.h +2 -2
  119. data/src/core/ext/transport/chttp2/transport/http2_settings.h +4 -5
  120. data/src/core/ext/transport/chttp2/transport/huffsyms.h +2 -3
  121. data/src/core/ext/transport/chttp2/transport/internal.h +27 -21
  122. data/src/core/ext/transport/chttp2/transport/parsing.cc +33 -43
  123. data/src/core/ext/transport/chttp2/transport/stream_map.h +2 -3
  124. data/src/core/ext/transport/chttp2/transport/writing.cc +24 -22
  125. data/src/core/ext/transport/inproc/inproc_transport.cc +54 -15
  126. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +0 -1
  127. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +3 -4
  128. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +4 -229
  129. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +5 -876
  130. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c +114 -0
  131. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +429 -0
  132. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c +72 -0
  133. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +198 -0
  134. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c +105 -0
  135. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +388 -0
  136. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.c +1 -0
  137. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +1 -2
  138. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +23 -10
  139. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +352 -310
  140. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +1 -0
  141. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +42 -34
  142. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c +1 -0
  143. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h +7 -7
  144. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c +1 -0
  145. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h +79 -61
  146. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +2 -1
  147. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +55 -49
  148. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c +35 -0
  149. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +79 -0
  150. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +48 -27
  151. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +258 -214
  152. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +1 -0
  153. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +51 -45
  154. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c +34 -0
  155. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +71 -0
  156. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +2 -1
  157. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +107 -100
  158. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +24 -20
  159. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +157 -122
  160. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c +1 -0
  161. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h +9 -9
  162. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +38 -18
  163. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +173 -73
  164. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c +34 -0
  165. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +88 -0
  166. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +2 -1
  167. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h +95 -101
  168. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.c +1 -0
  169. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +1 -2
  170. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +2 -1
  171. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h +49 -65
  172. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +1 -0
  173. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +0 -1
  174. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +9 -6
  175. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +53 -38
  176. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +1 -0
  177. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h +70 -62
  178. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.c +1 -0
  179. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.h +1 -2
  180. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +15 -10
  181. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +95 -63
  182. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +1 -0
  183. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h +0 -1
  184. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +3 -2
  185. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h +91 -80
  186. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +1 -0
  187. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h +9 -10
  188. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.c +1 -0
  189. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.h +1 -2
  190. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +1 -0
  191. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.h +36 -31
  192. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +1 -0
  193. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h +0 -1
  194. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +68 -46
  195. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +770 -722
  196. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +1 -0
  197. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h +16 -15
  198. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.c +1 -0
  199. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.h +1 -2
  200. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +2 -1
  201. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h +95 -88
  202. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +48 -28
  203. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +305 -210
  204. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c +1 -0
  205. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h +5 -5
  206. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c +51 -0
  207. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +125 -0
  208. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c +1 -0
  209. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h +1 -2
  210. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +4 -2
  211. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +22 -16
  212. data/src/core/ext/upb-generated/envoy/type/http.upb.c +1 -0
  213. data/src/core/ext/upb-generated/envoy/type/http.upb.h +0 -1
  214. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +16 -0
  215. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +48 -11
  216. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +1 -0
  217. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.h +14 -14
  218. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +1 -0
  219. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h +23 -23
  220. data/src/core/ext/upb-generated/envoy/type/percent.upb.c +1 -0
  221. data/src/core/ext/upb-generated/envoy/type/percent.upb.h +8 -9
  222. data/src/core/ext/upb-generated/envoy/type/range.upb.c +1 -0
  223. data/src/core/ext/upb-generated/envoy/type/range.upb.h +15 -16
  224. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.c +1 -0
  225. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.h +7 -8
  226. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +1 -0
  227. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h +36 -35
  228. data/src/core/ext/upb-generated/gogoproto/gogo.upb.h +0 -1
  229. data/src/core/ext/upb-generated/google/api/annotations.upb.h +0 -1
  230. data/src/core/ext/upb-generated/google/api/http.upb.h +29 -28
  231. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +5 -6
  232. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +12 -11
  233. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +421 -389
  234. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +5 -6
  235. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +1 -2
  236. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +1 -1
  237. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +33 -54
  238. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +5 -6
  239. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +27 -28
  240. data/src/core/ext/upb-generated/google/rpc/status.upb.h +8 -8
  241. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +1 -1
  242. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +32 -45
  243. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +4 -4
  244. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +157 -178
  245. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +14 -13
  246. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +6 -7
  247. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +59 -56
  248. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +11 -12
  249. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +0 -1
  250. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +28 -0
  251. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +64 -0
  252. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +6 -6
  253. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +41 -68
  254. data/src/core/ext/upb-generated/validate/validate.upb.c +21 -20
  255. data/src/core/ext/upb-generated/validate/validate.upb.h +569 -562
  256. data/src/core/lib/channel/channel_args.cc +15 -14
  257. data/src/core/lib/channel/channel_args.h +3 -1
  258. data/src/core/lib/channel/channel_stack.h +20 -13
  259. data/src/core/lib/channel/channel_trace.cc +2 -6
  260. data/src/core/lib/channel/channelz.cc +10 -21
  261. data/src/core/lib/channel/channelz.h +3 -2
  262. data/src/core/lib/channel/channelz_registry.cc +5 -3
  263. data/src/core/lib/channel/connected_channel.cc +7 -5
  264. data/src/core/lib/channel/context.h +1 -1
  265. data/src/core/lib/channel/handshaker.cc +11 -13
  266. data/src/core/lib/channel/handshaker.h +4 -2
  267. data/src/core/lib/channel/handshaker_registry.cc +5 -17
  268. data/src/core/lib/channel/status_util.cc +2 -3
  269. data/src/core/lib/compression/message_compress.cc +5 -1
  270. data/src/core/lib/debug/stats.cc +21 -27
  271. data/src/core/lib/debug/stats.h +3 -1
  272. data/src/core/lib/gpr/log_linux.cc +6 -8
  273. data/src/core/lib/gpr/log_posix.cc +6 -8
  274. data/src/core/lib/gpr/spinlock.h +2 -3
  275. data/src/core/lib/gpr/string.cc +10 -33
  276. data/src/core/lib/gpr/string.h +4 -18
  277. data/src/core/lib/gpr/sync_abseil.cc +2 -0
  278. data/src/core/lib/gpr/time.cc +4 -0
  279. data/src/core/lib/gpr/time_posix.cc +1 -1
  280. data/src/core/lib/gprpp/atomic.h +6 -6
  281. data/src/core/lib/gprpp/fork.cc +1 -1
  282. data/src/core/lib/gprpp/global_config_env.cc +8 -6
  283. data/src/core/lib/gprpp/host_port.cc +29 -35
  284. data/src/core/lib/gprpp/host_port.h +14 -17
  285. data/src/core/lib/gprpp/map.h +5 -11
  286. data/src/core/lib/gprpp/ref_counted_ptr.h +5 -0
  287. data/src/core/lib/gprpp/sync.h +9 -0
  288. data/src/core/lib/http/format_request.cc +46 -65
  289. data/src/core/lib/http/httpcli.cc +15 -13
  290. data/src/core/lib/http/httpcli.h +2 -3
  291. data/src/core/lib/http/httpcli_security_connector.cc +10 -10
  292. data/src/core/lib/http/parser.h +2 -3
  293. data/src/core/lib/iomgr/buffer_list.h +22 -21
  294. data/src/core/lib/iomgr/call_combiner.h +3 -2
  295. data/src/core/lib/iomgr/cfstream_handle.cc +4 -2
  296. data/src/core/lib/iomgr/closure.h +2 -3
  297. data/src/core/lib/iomgr/dualstack_socket_posix.cc +47 -0
  298. data/src/core/lib/iomgr/endpoint_cfstream.cc +2 -3
  299. data/src/core/lib/iomgr/endpoint_pair.h +2 -3
  300. data/src/core/lib/iomgr/endpoint_pair_posix.cc +10 -10
  301. data/src/core/lib/iomgr/error.cc +6 -9
  302. data/src/core/lib/iomgr/error.h +0 -1
  303. data/src/core/lib/iomgr/error_cfstream.cc +9 -8
  304. data/src/core/lib/iomgr/ev_apple.cc +356 -0
  305. data/src/core/lib/iomgr/ev_apple.h +43 -0
  306. data/src/core/lib/iomgr/ev_epoll1_linux.cc +25 -29
  307. data/src/core/lib/iomgr/ev_epollex_linux.cc +17 -24
  308. data/src/core/lib/iomgr/ev_poll_posix.cc +9 -8
  309. data/src/core/lib/iomgr/ev_posix.cc +4 -3
  310. data/src/core/lib/iomgr/exec_ctx.h +14 -2
  311. data/src/core/lib/iomgr/iomgr.cc +10 -0
  312. data/src/core/lib/iomgr/iomgr.h +10 -0
  313. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +84 -20
  314. data/src/core/lib/iomgr/is_epollexclusive_available.cc +14 -0
  315. data/src/core/lib/iomgr/pollset_set_custom.cc +10 -10
  316. data/src/core/lib/{gprpp/optional.h → iomgr/pollset_uv.h} +11 -12
  317. data/src/core/lib/iomgr/port.h +2 -21
  318. data/src/core/lib/iomgr/python_util.h +46 -0
  319. data/src/core/lib/iomgr/resolve_address.h +4 -6
  320. data/src/core/lib/iomgr/resolve_address_custom.cc +42 -57
  321. data/src/core/lib/iomgr/resolve_address_custom.h +4 -2
  322. data/src/core/lib/iomgr/resolve_address_posix.cc +10 -11
  323. data/src/core/lib/iomgr/resolve_address_windows.cc +16 -25
  324. data/src/core/lib/iomgr/resource_quota.cc +38 -37
  325. data/src/core/lib/iomgr/sockaddr_utils.cc +29 -33
  326. data/src/core/lib/iomgr/sockaddr_utils.h +10 -15
  327. data/src/core/lib/iomgr/socket_factory_posix.h +2 -3
  328. data/src/core/lib/iomgr/socket_mutator.h +2 -3
  329. data/src/core/lib/iomgr/socket_utils_common_posix.cc +102 -81
  330. data/src/core/lib/iomgr/socket_utils_posix.h +3 -0
  331. data/src/core/lib/iomgr/socket_windows.cc +4 -5
  332. data/src/core/lib/iomgr/tcp_client_cfstream.cc +14 -18
  333. data/src/core/lib/iomgr/tcp_client_custom.cc +6 -9
  334. data/src/core/lib/iomgr/tcp_client_posix.cc +30 -36
  335. data/src/core/lib/iomgr/tcp_client_windows.cc +10 -11
  336. data/src/core/lib/iomgr/tcp_custom.cc +3 -4
  337. data/src/core/lib/iomgr/tcp_custom.h +1 -1
  338. data/src/core/lib/iomgr/tcp_server.cc +3 -4
  339. data/src/core/lib/iomgr/tcp_server.h +7 -5
  340. data/src/core/lib/iomgr/tcp_server_custom.cc +11 -23
  341. data/src/core/lib/iomgr/tcp_server_posix.cc +38 -44
  342. data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -4
  343. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +7 -8
  344. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +10 -18
  345. data/src/core/lib/iomgr/tcp_server_windows.cc +16 -16
  346. data/src/core/lib/iomgr/tcp_uv.cc +3 -2
  347. data/src/core/lib/iomgr/time_averaged_stats.h +2 -3
  348. data/src/core/lib/iomgr/timer_generic.cc +15 -15
  349. data/src/core/lib/{gprpp/inlined_vector.h → iomgr/timer_generic.h} +19 -17
  350. data/src/core/lib/iomgr/timer_heap.h +2 -3
  351. data/src/core/lib/iomgr/udp_server.cc +32 -36
  352. data/src/core/lib/iomgr/udp_server.h +5 -2
  353. data/src/core/lib/iomgr/unix_sockets_posix.cc +9 -14
  354. data/src/core/lib/iomgr/unix_sockets_posix.h +3 -1
  355. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +5 -2
  356. data/src/core/lib/json/json.h +3 -2
  357. data/src/core/lib/json/json_reader.cc +25 -26
  358. data/src/core/lib/json/json_writer.cc +13 -12
  359. data/src/core/lib/security/credentials/composite/composite_credentials.cc +12 -0
  360. data/src/core/lib/security/credentials/composite/composite_credentials.h +6 -3
  361. data/src/core/lib/security/credentials/credentials.cc +0 -84
  362. data/src/core/lib/security/credentials/credentials.h +13 -62
  363. data/src/core/lib/security/credentials/fake/fake_credentials.h +4 -0
  364. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +8 -6
  365. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +15 -17
  366. data/src/core/lib/security/credentials/iam/iam_credentials.cc +8 -6
  367. data/src/core/lib/security/credentials/iam/iam_credentials.h +4 -0
  368. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  369. data/src/core/lib/security/credentials/jwt/json_token.h +2 -5
  370. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +7 -4
  371. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +12 -0
  372. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +8 -15
  373. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -3
  374. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +73 -54
  375. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +9 -3
  376. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +19 -6
  377. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -0
  378. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +20 -0
  379. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +10 -0
  380. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +23 -13
  381. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +48 -11
  382. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +21 -6
  383. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +17 -17
  384. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +3 -2
  385. data/src/core/lib/security/security_connector/local/local_security_connector.cc +1 -1
  386. data/src/core/lib/security/security_connector/security_connector.cc +2 -0
  387. data/src/core/lib/security/security_connector/security_connector.h +2 -2
  388. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +38 -36
  389. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +8 -5
  390. data/src/core/lib/security/security_connector/ssl_utils.cc +89 -21
  391. data/src/core/lib/security/security_connector/ssl_utils.h +18 -12
  392. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +101 -72
  393. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +27 -5
  394. data/src/core/lib/security/transport/auth_filters.h +0 -5
  395. data/src/core/lib/security/transport/client_auth_filter.cc +11 -11
  396. data/src/core/lib/security/util/json_util.cc +12 -13
  397. data/src/core/lib/slice/slice.cc +38 -1
  398. data/src/core/lib/slice/slice_intern.cc +2 -3
  399. data/src/core/lib/slice/slice_internal.h +15 -0
  400. data/src/core/lib/slice/slice_utils.h +9 -0
  401. data/src/core/lib/surface/byte_buffer_reader.cc +2 -47
  402. data/src/core/lib/surface/call.cc +42 -44
  403. data/src/core/lib/surface/call_log_batch.cc +50 -58
  404. data/src/core/lib/surface/channel.cc +53 -31
  405. data/src/core/lib/surface/channel.h +35 -4
  406. data/src/core/lib/surface/channel_ping.cc +2 -3
  407. data/src/core/lib/surface/completion_queue.cc +304 -47
  408. data/src/core/lib/surface/completion_queue.h +8 -0
  409. data/src/core/lib/surface/event_string.cc +18 -25
  410. data/src/core/lib/surface/event_string.h +3 -1
  411. data/src/core/lib/surface/init.cc +2 -0
  412. data/src/core/lib/surface/init_secure.cc +1 -4
  413. data/src/core/lib/surface/server.cc +971 -837
  414. data/src/core/lib/surface/server.h +66 -12
  415. data/src/core/lib/surface/version.cc +2 -2
  416. data/src/core/lib/transport/byte_stream.h +7 -2
  417. data/src/core/lib/transport/connectivity_state.cc +7 -6
  418. data/src/core/lib/transport/connectivity_state.h +5 -3
  419. data/src/core/lib/transport/metadata.cc +3 -3
  420. data/src/core/lib/transport/metadata_batch.h +2 -3
  421. data/src/core/lib/transport/static_metadata.h +1 -1
  422. data/src/core/lib/transport/status_conversion.cc +6 -14
  423. data/src/core/lib/transport/transport.cc +2 -3
  424. data/src/core/lib/transport/transport.h +9 -2
  425. data/src/core/lib/transport/transport_op_string.cc +61 -102
  426. data/src/core/lib/uri/uri_parser.cc +8 -15
  427. data/src/core/lib/uri/uri_parser.h +2 -3
  428. data/src/core/plugin_registry/grpc_plugin_registry.cc +24 -4
  429. data/src/core/tsi/alts/crypt/aes_gcm.cc +0 -2
  430. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +31 -14
  431. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +8 -4
  432. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +34 -2
  433. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +9 -1
  434. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +2 -0
  435. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +2 -3
  436. data/src/core/tsi/fake_transport_security.cc +10 -15
  437. data/src/core/tsi/ssl/session_cache/ssl_session.h +0 -2
  438. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +0 -2
  439. data/src/core/tsi/ssl_transport_security.cc +154 -50
  440. data/src/core/tsi/ssl_transport_security.h +22 -10
  441. data/src/core/tsi/ssl_types.h +0 -2
  442. data/src/core/tsi/transport_security.h +6 -9
  443. data/src/core/tsi/transport_security_grpc.h +2 -3
  444. data/src/core/tsi/transport_security_interface.h +8 -3
  445. data/src/ruby/ext/grpc/extconf.rb +5 -2
  446. data/src/ruby/ext/grpc/rb_call.c +12 -3
  447. data/src/ruby/ext/grpc/rb_call.h +4 -0
  448. data/src/ruby/ext/grpc/rb_call_credentials.c +57 -12
  449. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  450. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  451. data/src/ruby/lib/grpc/errors.rb +103 -42
  452. data/src/ruby/lib/grpc/generic/active_call.rb +2 -3
  453. data/src/ruby/lib/grpc/generic/interceptors.rb +5 -5
  454. data/src/ruby/lib/grpc/generic/rpc_server.rb +9 -10
  455. data/src/ruby/lib/grpc/generic/service.rb +5 -4
  456. data/src/ruby/lib/grpc/structs.rb +1 -1
  457. data/src/ruby/lib/grpc/version.rb +1 -1
  458. data/src/ruby/pb/generate_proto_ruby.sh +5 -3
  459. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +11 -0
  460. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +16 -0
  461. data/src/ruby/spec/debug_message_spec.rb +134 -0
  462. data/src/ruby/spec/generic/service_spec.rb +2 -0
  463. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_import2.proto +23 -0
  464. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +7 -0
  465. data/src/ruby/spec/pb/codegen/package_option_spec.rb +7 -1
  466. data/src/ruby/spec/support/services.rb +10 -4
  467. data/src/ruby/spec/testdata/ca.pem +18 -13
  468. data/src/ruby/spec/testdata/client.key +26 -14
  469. data/src/ruby/spec/testdata/client.pem +18 -12
  470. data/src/ruby/spec/testdata/server1.key +26 -14
  471. data/src/ruby/spec/testdata/server1.pem +20 -14
  472. data/third_party/abseil-cpp/absl/time/civil_time.cc +175 -0
  473. data/third_party/abseil-cpp/absl/time/civil_time.h +538 -0
  474. data/third_party/abseil-cpp/absl/time/clock.cc +569 -0
  475. data/third_party/abseil-cpp/absl/time/clock.h +74 -0
  476. data/third_party/abseil-cpp/absl/time/duration.cc +922 -0
  477. data/third_party/abseil-cpp/absl/time/format.cc +153 -0
  478. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time.h +332 -0
  479. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +622 -0
  480. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +384 -0
  481. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +102 -0
  482. data/third_party/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc +94 -0
  483. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +140 -0
  484. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.h +52 -0
  485. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +922 -0
  486. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc +45 -0
  487. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +76 -0
  488. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +121 -0
  489. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +93 -0
  490. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +958 -0
  491. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +138 -0
  492. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +308 -0
  493. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.h +55 -0
  494. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +187 -0
  495. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc +159 -0
  496. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.h +132 -0
  497. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +122 -0
  498. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +115 -0
  499. data/third_party/abseil-cpp/absl/time/internal/get_current_time_chrono.inc +31 -0
  500. data/third_party/abseil-cpp/absl/time/internal/get_current_time_posix.inc +24 -0
  501. data/third_party/abseil-cpp/absl/time/time.cc +499 -0
  502. data/third_party/abseil-cpp/absl/time/time.h +1584 -0
  503. data/third_party/boringssl-with-bazel/err_data.c +335 -297
  504. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +3 -3
  505. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +3 -3
  506. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +1 -1
  507. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +3 -3
  508. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +2 -2
  509. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +1 -1
  510. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -1
  511. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +1 -1
  512. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +1 -1
  513. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +1 -1
  514. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c +1 -1
  515. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c +1 -1
  516. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +1 -0
  517. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +7 -5
  518. data/third_party/boringssl-with-bazel/src/crypto/cpu-intel.c +13 -4
  519. data/third_party/boringssl-with-bazel/src/crypto/crypto.c +11 -0
  520. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/curve25519.c +18 -26
  521. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/curve25519_tables.h +13 -21
  522. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/internal.h +14 -22
  523. data/third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c +1 -1
  524. data/third_party/boringssl-with-bazel/src/crypto/dh/dh.c +15 -0
  525. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +10 -0
  526. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +385 -0
  527. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +56 -0
  528. data/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c +2 -2
  529. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +33 -32
  530. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +143 -0
  531. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c +1 -1
  532. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.c +17 -1
  533. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +2 -1
  534. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +3 -3
  535. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +25 -12
  536. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c +8 -8
  537. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.c +30 -154
  538. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +16 -0
  539. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +289 -117
  540. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +13 -27
  541. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +96 -55
  542. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/felem.c +25 -7
  543. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +434 -161
  544. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +63 -71
  545. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +18 -25
  546. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64-table.h +9481 -9485
  547. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.c +104 -122
  548. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +740 -0
  549. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256_table.h +297 -0
  550. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c +90 -11
  551. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +125 -148
  552. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +189 -3
  553. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/util.c +3 -3
  554. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +61 -18
  555. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +2 -2
  556. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +20 -5
  557. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.c +137 -0
  558. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.h +49 -0
  559. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/getrandom_fillin.h +64 -0
  560. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +41 -5
  561. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +32 -17
  562. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +24 -114
  563. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/blinding.c +4 -0
  564. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +1 -0
  565. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +51 -38
  566. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +15 -1
  567. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +62 -0
  568. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +44 -35
  569. data/third_party/boringssl-with-bazel/src/crypto/mem.c +47 -16
  570. data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +15 -1
  571. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +7 -0
  572. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +36 -5
  573. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c +6 -10
  574. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c +16 -0
  575. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +4 -0
  576. data/third_party/boringssl-with-bazel/src/crypto/thread_win.c +4 -0
  577. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +249 -0
  578. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +1227 -0
  579. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +682 -0
  580. data/third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c +4 -4
  581. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +8 -0
  582. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +4 -4
  583. data/third_party/boringssl-with-bazel/src/crypto/x509/x509.c +0 -67
  584. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +13 -6
  585. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +10 -0
  586. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +57 -0
  587. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +4 -1
  588. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +33 -9
  589. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +25 -0
  590. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +4 -3
  591. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +35 -13
  592. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +0 -154
  593. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +28 -6
  594. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +5 -0
  595. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +74 -35
  596. data/third_party/boringssl-with-bazel/src/include/openssl/aes.h +16 -4
  597. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +22 -22
  598. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +6 -2
  599. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +9 -4
  600. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +20 -0
  601. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +1 -0
  602. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +16 -0
  603. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +6 -0
  604. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +2 -0
  605. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +69 -0
  606. data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +5 -0
  607. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +3 -17
  608. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +31 -0
  609. data/third_party/boringssl-with-bazel/src/include/openssl/sha.h +26 -0
  610. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +191 -79
  611. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +1 -0
  612. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +282 -0
  613. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +791 -715
  614. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +1 -0
  615. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +0 -4
  616. data/third_party/boringssl-with-bazel/src/ssl/d1_lib.cc +3 -3
  617. data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +13 -4
  618. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +146 -57
  619. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +23 -5
  620. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +30 -22
  621. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +21 -4
  622. data/third_party/boringssl-with-bazel/src/ssl/internal.h +74 -54
  623. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +10 -10
  624. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +2 -2
  625. data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +21 -21
  626. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +29 -0
  627. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -0
  628. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +34 -1
  629. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +13 -2
  630. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +44 -5
  631. data/third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc +6 -0
  632. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +5 -5
  633. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +51 -26
  634. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +47 -53
  635. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +1 -1
  636. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +129 -48
  637. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +23 -75
  638. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +55 -22
  639. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +63 -25
  640. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_32.h +245 -175
  641. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64.h +135 -75
  642. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_32.h +1593 -1672
  643. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64.h +512 -503
  644. data/third_party/upb/upb/decode.c +467 -504
  645. data/third_party/upb/upb/encode.c +163 -121
  646. data/third_party/upb/upb/msg.c +130 -64
  647. data/third_party/upb/upb/msg.h +418 -14
  648. data/third_party/upb/upb/port_def.inc +35 -6
  649. data/third_party/upb/upb/port_undef.inc +8 -1
  650. data/third_party/upb/upb/table.c +53 -75
  651. data/third_party/upb/upb/table.int.h +11 -43
  652. data/third_party/upb/upb/upb.c +148 -124
  653. data/third_party/upb/upb/upb.h +65 -147
  654. data/third_party/upb/upb/upb.hpp +86 -0
  655. metadata +122 -41
  656. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +0 -1908
  657. data/src/core/lib/gprpp/string_view.h +0 -60
  658. data/src/core/tsi/grpc_shadow_boringssl.h +0 -3311
  659. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256.c +0 -1063
  660. data/third_party/upb/upb/generated_util.h +0 -105
@@ -28,13 +28,19 @@
28
28
 
29
29
  #include <set>
30
30
 
31
+ #include "absl/strings/string_view.h"
32
+
31
33
  #include <grpc/support/alloc.h>
32
34
  #include <grpc/support/log.h>
33
35
  #include <grpc/support/string_util.h>
34
36
  #include <grpc/support/sync.h>
35
37
 
38
+ #include "absl/container/inlined_vector.h"
39
+ #include "absl/types/optional.h"
40
+
36
41
  #include "src/core/ext/filters/client_channel/backend_metric.h"
37
42
  #include "src/core/ext/filters/client_channel/backup_poller.h"
43
+ #include "src/core/ext/filters/client_channel/config_selector.h"
38
44
  #include "src/core/ext/filters/client_channel/global_subchannel_pool.h"
39
45
  #include "src/core/ext/filters/client_channel/http_connect_handshaker.h"
40
46
  #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
@@ -45,6 +51,7 @@
45
51
  #include "src/core/ext/filters/client_channel/resolving_lb_policy.h"
46
52
  #include "src/core/ext/filters/client_channel/retry_throttle.h"
47
53
  #include "src/core/ext/filters/client_channel/service_config.h"
54
+ #include "src/core/ext/filters/client_channel/service_config_call_data.h"
48
55
  #include "src/core/ext/filters/client_channel/subchannel.h"
49
56
  #include "src/core/ext/filters/deadline/deadline_filter.h"
50
57
  #include "src/core/lib/backoff/backoff.h"
@@ -52,13 +59,12 @@
52
59
  #include "src/core/lib/channel/connected_channel.h"
53
60
  #include "src/core/lib/channel/status_util.h"
54
61
  #include "src/core/lib/gpr/string.h"
55
- #include "src/core/lib/gprpp/inlined_vector.h"
56
62
  #include "src/core/lib/gprpp/manual_constructor.h"
57
63
  #include "src/core/lib/gprpp/map.h"
58
64
  #include "src/core/lib/gprpp/sync.h"
59
- #include "src/core/lib/iomgr/combiner.h"
60
65
  #include "src/core/lib/iomgr/iomgr.h"
61
66
  #include "src/core/lib/iomgr/polling_entity.h"
67
+ #include "src/core/lib/iomgr/work_serializer.h"
62
68
  #include "src/core/lib/profiling/timers.h"
63
69
  #include "src/core/lib/slice/slice_internal.h"
64
70
  #include "src/core/lib/slice/slice_string_helpers.h"
@@ -126,6 +132,7 @@ class ChannelData {
126
132
  size_t per_rpc_retry_buffer_size() const {
127
133
  return per_rpc_retry_buffer_size_;
128
134
  }
135
+ grpc_channel_stack* owning_stack() const { return owning_stack_; }
129
136
 
130
137
  // Note: Does NOT return a new ref.
131
138
  grpc_error* disconnect_error() const {
@@ -143,12 +150,17 @@ class ChannelData {
143
150
  bool received_service_config_data() const {
144
151
  return received_service_config_data_;
145
152
  }
153
+ grpc_error* resolver_transient_failure_error() const {
154
+ return resolver_transient_failure_error_;
155
+ }
146
156
  RefCountedPtr<ServerRetryThrottleData> retry_throttle_data() const {
147
157
  return retry_throttle_data_;
148
158
  }
149
159
  RefCountedPtr<ServiceConfig> service_config() const {
150
160
  return service_config_;
151
161
  }
162
+ ConfigSelector* config_selector() const { return config_selector_.get(); }
163
+ WorkSerializer* work_serializer() const { return work_serializer_.get(); }
152
164
 
153
165
  RefCountedPtr<ConnectedSubchannel> GetConnectedSubchannelInDataPlane(
154
166
  SubchannelInterface* subchannel) const;
@@ -159,21 +171,14 @@ class ChannelData {
159
171
  grpc_connectivity_state* state,
160
172
  grpc_closure* on_complete,
161
173
  grpc_closure* watcher_timer_init) {
162
- MutexLock lock(&external_watchers_mu_);
163
- // Will be deleted when the watch is complete.
164
- GPR_ASSERT(external_watchers_[on_complete] == nullptr);
165
- external_watchers_[on_complete] = new ExternalConnectivityWatcher(
166
- this, pollent, state, on_complete, watcher_timer_init);
174
+ new ExternalConnectivityWatcher(this, pollent, state, on_complete,
175
+ watcher_timer_init);
167
176
  }
168
177
 
169
178
  void RemoveExternalConnectivityWatcher(grpc_closure* on_complete,
170
179
  bool cancel) {
171
- MutexLock lock(&external_watchers_mu_);
172
- auto it = external_watchers_.find(on_complete);
173
- if (it != external_watchers_.end()) {
174
- if (cancel) it->second->Cancel();
175
- external_watchers_.erase(it);
176
- }
180
+ ExternalConnectivityWatcher::RemoveWatcherFromExternalWatchersMap(
181
+ this, on_complete, cancel);
177
182
  }
178
183
 
179
184
  int NumExternalConnectivityWatchers() const {
@@ -204,13 +209,20 @@ class ChannelData {
204
209
 
205
210
  ~ExternalConnectivityWatcher();
206
211
 
212
+ // Removes the watcher from the external_watchers_ map.
213
+ static void RemoveWatcherFromExternalWatchersMap(ChannelData* chand,
214
+ grpc_closure* on_complete,
215
+ bool cancel);
216
+
207
217
  void Notify(grpc_connectivity_state state) override;
208
218
 
209
219
  void Cancel();
210
220
 
211
221
  private:
212
- static void AddWatcherLocked(void* arg, grpc_error* ignored);
213
- static void RemoveWatcherLocked(void* arg, grpc_error* ignored);
222
+ // Adds the watcher to state_tracker_. Consumes the ref that is passed to it
223
+ // from Start().
224
+ void AddWatcherLocked();
225
+ void RemoveWatcherLocked();
214
226
 
215
227
  ChannelData* chand_;
216
228
  grpc_polling_entity pollent_;
@@ -218,11 +230,32 @@ class ChannelData {
218
230
  grpc_connectivity_state* state_;
219
231
  grpc_closure* on_complete_;
220
232
  grpc_closure* watcher_timer_init_;
221
- grpc_closure add_closure_;
222
- grpc_closure remove_closure_;
223
233
  Atomic<bool> done_{false};
224
234
  };
225
235
 
236
+ class ChannelConfigHelper
237
+ : public ResolvingLoadBalancingPolicy::ChannelConfigHelper {
238
+ public:
239
+ explicit ChannelConfigHelper(ChannelData* chand) : chand_(chand) {}
240
+
241
+ ApplyServiceConfigResult ApplyServiceConfig(
242
+ const Resolver::Result& result) override;
243
+
244
+ void ApplyConfigSelector(
245
+ bool service_config_changed,
246
+ RefCountedPtr<ConfigSelector> config_selector) override;
247
+
248
+ void ResolverTransientFailure(grpc_error* error) override;
249
+
250
+ private:
251
+ static void ProcessLbPolicy(
252
+ const Resolver::Result& resolver_result,
253
+ const internal::ClientChannelGlobalParsedConfig* parsed_service_config,
254
+ RefCountedPtr<LoadBalancingPolicy::Config>* lb_policy_config);
255
+
256
+ ChannelData* chand_;
257
+ };
258
+
226
259
  ChannelData(grpc_channel_element_args* args, grpc_error** error);
227
260
  ~ChannelData();
228
261
 
@@ -230,29 +263,19 @@ class ChannelData {
230
263
  grpc_connectivity_state state, const char* reason,
231
264
  std::unique_ptr<LoadBalancingPolicy::SubchannelPicker> picker);
232
265
 
233
- void UpdateServiceConfigLocked(
234
- RefCountedPtr<ServerRetryThrottleData> retry_throttle_data,
235
- RefCountedPtr<ServiceConfig> service_config);
266
+ void UpdateServiceConfigInDataPlaneLocked(
267
+ bool service_config_changed,
268
+ RefCountedPtr<ConfigSelector> config_selector);
236
269
 
237
270
  void CreateResolvingLoadBalancingPolicyLocked();
238
271
 
239
272
  void DestroyResolvingLoadBalancingPolicyLocked();
240
273
 
241
- static bool ProcessResolverResultLocked(
242
- void* arg, const Resolver::Result& result,
243
- RefCountedPtr<LoadBalancingPolicy::Config>* lb_policy_config,
244
- grpc_error** service_config_error, bool* no_valid_service_config);
245
-
246
274
  grpc_error* DoPingLocked(grpc_transport_op* op);
247
275
 
248
- static void StartTransportOpLocked(void* arg, grpc_error* ignored);
249
-
250
- static void TryToConnectLocked(void* arg, grpc_error* error_ignored);
276
+ void StartTransportOpLocked(grpc_transport_op* op);
251
277
 
252
- void ProcessLbPolicy(
253
- const Resolver::Result& resolver_result,
254
- const internal::ClientChannelGlobalParsedConfig* parsed_service_config,
255
- RefCountedPtr<LoadBalancingPolicy::Config>* lb_policy_config);
278
+ void TryToConnectLocked();
256
279
 
257
280
  //
258
281
  // Fields set at construction and never modified.
@@ -267,6 +290,7 @@ class ChannelData {
267
290
  grpc_core::UniquePtr<char> server_name_;
268
291
  grpc_core::UniquePtr<char> target_uri_;
269
292
  channelz::ChannelNode* channelz_node_;
293
+ ChannelConfigHelper channel_config_helper_;
270
294
 
271
295
  //
272
296
  // Fields used in the data plane. Guarded by data_plane_mu.
@@ -275,36 +299,39 @@ class ChannelData {
275
299
  std::unique_ptr<LoadBalancingPolicy::SubchannelPicker> picker_;
276
300
  QueuedPick* queued_picks_ = nullptr; // Linked list of queued picks.
277
301
  // Data from service config.
302
+ grpc_error* resolver_transient_failure_error_ = GRPC_ERROR_NONE;
278
303
  bool received_service_config_data_ = false;
279
304
  RefCountedPtr<ServerRetryThrottleData> retry_throttle_data_;
280
305
  RefCountedPtr<ServiceConfig> service_config_;
306
+ RefCountedPtr<ConfigSelector> config_selector_;
281
307
 
282
308
  //
283
- // Fields used in the control plane. Guarded by combiner.
309
+ // Fields used in the control plane. Guarded by work_serializer.
284
310
  //
285
- Combiner* combiner_;
311
+ std::shared_ptr<WorkSerializer> work_serializer_;
286
312
  grpc_pollset_set* interested_parties_;
287
313
  RefCountedPtr<SubchannelPoolInterface> subchannel_pool_;
288
314
  OrphanablePtr<ResolvingLoadBalancingPolicy> resolving_lb_policy_;
289
315
  ConnectivityStateTracker state_tracker_;
290
316
  grpc_core::UniquePtr<char> health_check_service_name_;
291
317
  RefCountedPtr<ServiceConfig> saved_service_config_;
318
+ RefCountedPtr<ConfigSelector> saved_config_selector_;
292
319
  bool received_first_resolver_result_ = false;
293
320
  // The number of SubchannelWrapper instances referencing a given Subchannel.
294
321
  std::map<Subchannel*, int> subchannel_refcount_map_;
295
322
  // The set of SubchannelWrappers that currently exist.
296
323
  // No need to hold a ref, since the map is updated in the control-plane
297
- // combiner when the SubchannelWrappers are created and destroyed.
324
+ // work_serializer when the SubchannelWrappers are created and destroyed.
298
325
  std::set<SubchannelWrapper*> subchannel_wrappers_;
299
326
  // Pending ConnectedSubchannel updates for each SubchannelWrapper.
300
- // Updates are queued here in the control plane combiner and then applied
301
- // in the data plane mutex when the picker is updated.
302
- std::map<RefCountedPtr<SubchannelWrapper>, RefCountedPtr<ConnectedSubchannel>,
303
- RefCountedPtrLess<SubchannelWrapper>>
327
+ // Updates are queued here in the control plane work_serializer and then
328
+ // applied in the data plane mutex when the picker is updated.
329
+ std::map<RefCountedPtr<SubchannelWrapper>, RefCountedPtr<ConnectedSubchannel>>
304
330
  pending_subchannel_updates_;
305
331
 
306
332
  //
307
- // Fields accessed from both data plane mutex and control plane combiner.
333
+ // Fields accessed from both data plane mutex and control plane
334
+ // work_serializer.
308
335
  //
309
336
  Atomic<grpc_error*> disconnect_error_;
310
337
 
@@ -321,7 +348,8 @@ class ChannelData {
321
348
  // synchronously via grpc_channel_num_external_connectivity_watchers().
322
349
  //
323
350
  mutable Mutex external_watchers_mu_;
324
- std::map<grpc_closure*, ExternalConnectivityWatcher*> external_watchers_;
351
+ std::map<grpc_closure*, RefCountedPtr<ExternalConnectivityWatcher>>
352
+ external_watchers_;
325
353
  };
326
354
 
327
355
  //
@@ -341,9 +369,6 @@ class CallData {
341
369
 
342
370
  RefCountedPtr<SubchannelCall> subchannel_call() { return subchannel_call_; }
343
371
 
344
- // Invoked by channel for queued picks once resolver results are available.
345
- void MaybeApplyServiceConfigToCallLocked(grpc_call_element* elem);
346
-
347
372
  // Invoked by channel for queued picks when the picker is updated.
348
373
  static void PickSubchannel(void* arg, grpc_error* error);
349
374
 
@@ -364,7 +389,7 @@ class CallData {
364
389
  Metadata(CallData* calld, grpc_metadata_batch* batch)
365
390
  : calld_(calld), batch_(batch) {}
366
391
 
367
- void Add(StringView key, StringView value) override {
392
+ void Add(absl::string_view key, absl::string_view value) override {
368
393
  grpc_linked_mdelem* linked_mdelem = static_cast<grpc_linked_mdelem*>(
369
394
  calld_->arena_->Alloc(sizeof(grpc_linked_mdelem)));
370
395
  linked_mdelem->md = grpc_mdelem_from_slices(
@@ -377,7 +402,8 @@ class CallData {
377
402
  iterator begin() const override {
378
403
  static_assert(sizeof(grpc_linked_mdelem*) <= sizeof(intptr_t),
379
404
  "iterator size too large");
380
- return iterator(this, reinterpret_cast<intptr_t>(batch_->list.head));
405
+ return iterator(
406
+ this, reinterpret_cast<intptr_t>(MaybeSkipEntry(batch_->list.head)));
381
407
  }
382
408
  iterator end() const override {
383
409
  static_assert(sizeof(grpc_linked_mdelem*) <= sizeof(intptr_t),
@@ -394,12 +420,20 @@ class CallData {
394
420
  }
395
421
 
396
422
  private:
423
+ grpc_linked_mdelem* MaybeSkipEntry(grpc_linked_mdelem* entry) const {
424
+ if (entry != nullptr && batch_->idx.named.path == entry) {
425
+ return entry->next;
426
+ }
427
+ return entry;
428
+ }
429
+
397
430
  intptr_t IteratorHandleNext(intptr_t handle) const override {
398
431
  grpc_linked_mdelem* linked_mdelem =
399
432
  reinterpret_cast<grpc_linked_mdelem*>(handle);
400
- return reinterpret_cast<intptr_t>(linked_mdelem->next);
433
+ return reinterpret_cast<intptr_t>(MaybeSkipEntry(linked_mdelem->next));
401
434
  }
402
- std::pair<StringView, StringView> IteratorHandleGet(
435
+
436
+ std::pair<absl::string_view, absl::string_view> IteratorHandleGet(
403
437
  intptr_t handle) const override {
404
438
  grpc_linked_mdelem* linked_mdelem =
405
439
  reinterpret_cast<grpc_linked_mdelem*>(handle);
@@ -431,6 +465,12 @@ class CallData {
431
465
  return calld_->backend_metric_data_;
432
466
  }
433
467
 
468
+ absl::string_view ExperimentalGetCallAttribute(const char* key) override {
469
+ auto it = calld_->call_attributes_.find(key);
470
+ if (it == calld_->call_attributes_.end()) return absl::string_view();
471
+ return it->second;
472
+ }
473
+
434
474
  private:
435
475
  CallData* calld_;
436
476
  };
@@ -725,13 +765,17 @@ class CallData {
725
765
  void CreateSubchannelCall(grpc_call_element* elem);
726
766
  // Invoked when a pick is completed, on both success or failure.
727
767
  static void PickDone(void* arg, grpc_error* error);
728
- // Removes the call from the channel's list of queued picks.
729
- void RemoveCallFromQueuedPicksLocked(grpc_call_element* elem);
730
- // Adds the call to the channel's list of queued picks.
731
- void AddCallToQueuedPicksLocked(grpc_call_element* elem);
768
+ // Removes the call from the channel's list of queued picks if present.
769
+ void MaybeRemoveCallFromQueuedPicksLocked(grpc_call_element* elem);
770
+ // Adds the call to the channel's list of queued picks if not already present.
771
+ void MaybeAddCallToQueuedPicksLocked(grpc_call_element* elem);
732
772
  // Applies service config to the call. Must be invoked once we know
733
773
  // that the resolver has returned results to the channel.
734
- void ApplyServiceConfigToCallLocked(grpc_call_element* elem);
774
+ // If an error is returned, the error indicates the status with which
775
+ // the call should be failed.
776
+ grpc_error* ApplyServiceConfigToCallLocked(
777
+ grpc_call_element* elem, grpc_metadata_batch* initial_metadata);
778
+ void MaybeInvokeConfigSelectorCommitCallback();
735
779
 
736
780
  // State for handling deadlines.
737
781
  // The code in deadline_filter.c requires this to be the first field.
@@ -750,8 +794,9 @@ class CallData {
750
794
  grpc_call_context_element* call_context_;
751
795
 
752
796
  RefCountedPtr<ServerRetryThrottleData> retry_throttle_data_;
753
- ServiceConfig::CallData service_config_call_data_;
754
797
  const ClientChannelMethodParsedConfig* method_params_ = nullptr;
798
+ std::map<const char*, absl::string_view> call_attributes_;
799
+ std::function<void()> on_call_committed_;
755
800
 
756
801
  RefCountedPtr<SubchannelCall> subchannel_call_;
757
802
 
@@ -820,7 +865,7 @@ class CallData {
820
865
  // Note: We inline the cache for the first 3 send_message ops and use
821
866
  // dynamic allocation after that. This number was essentially picked
822
867
  // at random; it could be changed in the future to tune performance.
823
- InlinedVector<ByteStreamCache*, 3> send_messages_;
868
+ absl::InlinedVector<ByteStreamCache*, 3> send_messages_;
824
869
  // send_trailing_metadata
825
870
  bool seen_send_trailing_metadata_ = false;
826
871
  grpc_linked_mdelem* send_trailing_metadata_storage_ = nullptr;
@@ -838,7 +883,7 @@ class CallData {
838
883
  // Note that no synchronization is needed here, because even if the
839
884
  // underlying subchannel is shared between channels, this wrapper will only
840
885
  // be used within one channel, so it will always be synchronized by the
841
- // control plane combiner.
886
+ // control plane work_serializer.
842
887
  class ChannelData::SubchannelWrapper : public SubchannelInterface {
843
888
  public:
844
889
  SubchannelWrapper(ChannelData* chand, Subchannel* subchannel,
@@ -907,7 +952,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
907
952
  initial_state,
908
953
  grpc_core::UniquePtr<char>(
909
954
  gpr_strdup(health_check_service_name_.get())),
910
- OrphanablePtr<Subchannel::ConnectivityStateWatcherInterface>(
955
+ RefCountedPtr<Subchannel::ConnectivityStateWatcherInterface>(
911
956
  watcher_wrapper));
912
957
  }
913
958
 
@@ -957,14 +1002,14 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
957
1002
  replacement->last_seen_state(),
958
1003
  grpc_core::UniquePtr<char>(
959
1004
  gpr_strdup(health_check_service_name.get())),
960
- OrphanablePtr<Subchannel::ConnectivityStateWatcherInterface>(
1005
+ RefCountedPtr<Subchannel::ConnectivityStateWatcherInterface>(
961
1006
  replacement));
962
1007
  }
963
1008
  // Save the new health check service name.
964
1009
  health_check_service_name_ = std::move(health_check_service_name);
965
1010
  }
966
1011
 
967
- // Caller must be holding the control-plane combiner.
1012
+ // Caller must be holding the control-plane work_serializer.
968
1013
  ConnectedSubchannel* connected_subchannel() const {
969
1014
  return connected_subchannel_.get();
970
1015
  }
@@ -1004,23 +1049,27 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
1004
1049
  parent_(std::move(parent)),
1005
1050
  last_seen_state_(initial_state) {}
1006
1051
 
1007
- ~WatcherWrapper() { parent_.reset(DEBUG_LOCATION, "WatcherWrapper"); }
1008
-
1009
- void Orphan() override { Unref(); }
1052
+ ~WatcherWrapper() {
1053
+ auto* parent = parent_.release(); // ref owned by lambda
1054
+ parent->chand_->work_serializer_->Run(
1055
+ [parent]() { parent->Unref(DEBUG_LOCATION, "WatcherWrapper"); },
1056
+ DEBUG_LOCATION);
1057
+ }
1010
1058
 
1011
- void OnConnectivityStateChange(
1012
- grpc_connectivity_state new_state,
1013
- RefCountedPtr<ConnectedSubchannel> connected_subchannel) override {
1059
+ void OnConnectivityStateChange() override {
1014
1060
  if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
1015
1061
  gpr_log(GPR_INFO,
1016
1062
  "chand=%p: connectivity change for subchannel wrapper %p "
1017
- "subchannel %p (connected_subchannel=%p state=%s); "
1018
- "hopping into combiner",
1019
- parent_->chand_, parent_.get(), parent_->subchannel_,
1020
- connected_subchannel.get(), ConnectivityStateName(new_state));
1063
+ "subchannel %p; hopping into work_serializer",
1064
+ parent_->chand_, parent_.get(), parent_->subchannel_);
1021
1065
  }
1022
- // Will delete itself.
1023
- new Updater(Ref(), new_state, std::move(connected_subchannel));
1066
+ Ref().release(); // ref owned by lambda
1067
+ parent_->chand_->work_serializer_->Run(
1068
+ [this]() {
1069
+ ApplyUpdateInControlPlaneWorkSerializer();
1070
+ Unref();
1071
+ },
1072
+ DEBUG_LOCATION);
1024
1073
  }
1025
1074
 
1026
1075
  grpc_pollset_set* interested_parties() override {
@@ -1040,50 +1089,25 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
1040
1089
  grpc_connectivity_state last_seen_state() const { return last_seen_state_; }
1041
1090
 
1042
1091
  private:
1043
- class Updater {
1044
- public:
1045
- Updater(RefCountedPtr<WatcherWrapper> parent,
1046
- grpc_connectivity_state new_state,
1047
- RefCountedPtr<ConnectedSubchannel> connected_subchannel)
1048
- : parent_(std::move(parent)),
1049
- state_(new_state),
1050
- connected_subchannel_(std::move(connected_subchannel)) {
1051
- parent_->parent_->chand_->combiner_->Run(
1052
- GRPC_CLOSURE_INIT(&closure_, ApplyUpdateInControlPlaneCombiner,
1053
- this, nullptr),
1054
- GRPC_ERROR_NONE);
1092
+ void ApplyUpdateInControlPlaneWorkSerializer() {
1093
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
1094
+ gpr_log(GPR_INFO,
1095
+ "chand=%p: processing connectivity change in work serializer "
1096
+ "for subchannel wrapper %p subchannel %p "
1097
+ "watcher=%p",
1098
+ parent_->chand_, parent_.get(), parent_->subchannel_,
1099
+ watcher_.get());
1055
1100
  }
1056
-
1057
- private:
1058
- static void ApplyUpdateInControlPlaneCombiner(void* arg,
1059
- grpc_error* /*error*/) {
1060
- Updater* self = static_cast<Updater*>(arg);
1061
- if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
1062
- gpr_log(GPR_INFO,
1063
- "chand=%p: processing connectivity change in combiner "
1064
- "for subchannel wrapper %p subchannel %p "
1065
- "(connected_subchannel=%p state=%s): watcher=%p",
1066
- self->parent_->parent_->chand_, self->parent_->parent_.get(),
1067
- self->parent_->parent_->subchannel_,
1068
- self->connected_subchannel_.get(),
1069
- ConnectivityStateName(self->state_),
1070
- self->parent_->watcher_.get());
1071
- }
1072
- // Ignore update if the parent WatcherWrapper has been replaced
1073
- // since this callback was scheduled.
1074
- if (self->parent_->watcher_ == nullptr) return;
1075
- self->parent_->last_seen_state_ = self->state_;
1076
- self->parent_->parent_->MaybeUpdateConnectedSubchannel(
1077
- std::move(self->connected_subchannel_));
1078
- self->parent_->watcher_->OnConnectivityStateChange(self->state_);
1079
- delete self;
1101
+ ConnectivityStateChange state_change = PopConnectivityStateChange();
1102
+ // Ignore update if the parent WatcherWrapper has been replaced
1103
+ // since this callback was scheduled.
1104
+ if (watcher_ != nullptr) {
1105
+ last_seen_state_ = state_change.state;
1106
+ parent_->MaybeUpdateConnectedSubchannel(
1107
+ std::move(state_change.connected_subchannel));
1108
+ watcher_->OnConnectivityStateChange(state_change.state);
1080
1109
  }
1081
-
1082
- RefCountedPtr<WatcherWrapper> parent_;
1083
- grpc_connectivity_state state_;
1084
- RefCountedPtr<ConnectedSubchannel> connected_subchannel_;
1085
- grpc_closure closure_;
1086
- };
1110
+ }
1087
1111
 
1088
1112
  std::unique_ptr<SubchannelInterface::ConnectivityStateWatcherInterface>
1089
1113
  watcher_;
@@ -1122,7 +1146,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
1122
1146
  // CancelConnectivityStateWatch() with its watcher, we know the
1123
1147
  // corresponding WrapperWatcher to cancel on the underlying subchannel.
1124
1148
  std::map<ConnectivityStateWatcherInterface*, WatcherWrapper*> watcher_map_;
1125
- // To be accessed only in the control plane combiner.
1149
+ // To be accessed only in the control plane work_serializer.
1126
1150
  RefCountedPtr<ConnectedSubchannel> connected_subchannel_;
1127
1151
  // To be accessed only in the data plane mutex.
1128
1152
  RefCountedPtr<ConnectedSubchannel> connected_subchannel_in_data_plane_;
@@ -1145,9 +1169,21 @@ ChannelData::ExternalConnectivityWatcher::ExternalConnectivityWatcher(
1145
1169
  grpc_polling_entity_add_to_pollset_set(&pollent_,
1146
1170
  chand_->interested_parties_);
1147
1171
  GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "ExternalConnectivityWatcher");
1148
- chand_->combiner_->Run(
1149
- GRPC_CLOSURE_INIT(&add_closure_, AddWatcherLocked, this, nullptr),
1150
- GRPC_ERROR_NONE);
1172
+ {
1173
+ MutexLock lock(&chand_->external_watchers_mu_);
1174
+ // Will be deleted when the watch is complete.
1175
+ GPR_ASSERT(chand->external_watchers_[on_complete] == nullptr);
1176
+ // Store a ref to the watcher in the external_watchers_ map.
1177
+ chand->external_watchers_[on_complete] =
1178
+ Ref(DEBUG_LOCATION, "AddWatcherToExternalWatchersMapLocked");
1179
+ }
1180
+ // Pass the ref from creating the object to Start().
1181
+ chand_->work_serializer_->Run(
1182
+ [this]() {
1183
+ // The ref is passed to AddWatcherLocked().
1184
+ AddWatcherLocked();
1185
+ },
1186
+ DEBUG_LOCATION);
1151
1187
  }
1152
1188
 
1153
1189
  ChannelData::ExternalConnectivityWatcher::~ExternalConnectivityWatcher() {
@@ -1157,6 +1193,24 @@ ChannelData::ExternalConnectivityWatcher::~ExternalConnectivityWatcher() {
1157
1193
  "ExternalConnectivityWatcher");
1158
1194
  }
1159
1195
 
1196
+ void ChannelData::ExternalConnectivityWatcher::
1197
+ RemoveWatcherFromExternalWatchersMap(ChannelData* chand,
1198
+ grpc_closure* on_complete,
1199
+ bool cancel) {
1200
+ RefCountedPtr<ExternalConnectivityWatcher> watcher;
1201
+ {
1202
+ MutexLock lock(&chand->external_watchers_mu_);
1203
+ auto it = chand->external_watchers_.find(on_complete);
1204
+ if (it != chand->external_watchers_.end()) {
1205
+ watcher = std::move(it->second);
1206
+ chand->external_watchers_.erase(it);
1207
+ }
1208
+ }
1209
+ // watcher->Cancel() will hop into the WorkSerializer, so we have to unlock
1210
+ // the mutex before calling it.
1211
+ if (watcher != nullptr && cancel) watcher->Cancel();
1212
+ }
1213
+
1160
1214
  void ChannelData::ExternalConnectivityWatcher::Notify(
1161
1215
  grpc_connectivity_state state) {
1162
1216
  bool done = false;
@@ -1169,13 +1223,12 @@ void ChannelData::ExternalConnectivityWatcher::Notify(
1169
1223
  // Report new state to the user.
1170
1224
  *state_ = state;
1171
1225
  ExecCtx::Run(DEBUG_LOCATION, on_complete_, GRPC_ERROR_NONE);
1172
- // Hop back into the combiner to clean up.
1226
+ // Hop back into the work_serializer to clean up.
1173
1227
  // Not needed in state SHUTDOWN, because the tracker will
1174
1228
  // automatically remove all watchers in that case.
1175
1229
  if (state != GRPC_CHANNEL_SHUTDOWN) {
1176
- chand_->combiner_->Run(
1177
- GRPC_CLOSURE_INIT(&remove_closure_, RemoveWatcherLocked, this, nullptr),
1178
- GRPC_ERROR_NONE);
1230
+ chand_->work_serializer_->Run([this]() { RemoveWatcherLocked(); },
1231
+ DEBUG_LOCATION);
1179
1232
  }
1180
1233
  }
1181
1234
 
@@ -1186,28 +1239,20 @@ void ChannelData::ExternalConnectivityWatcher::Cancel() {
1186
1239
  return; // Already done.
1187
1240
  }
1188
1241
  ExecCtx::Run(DEBUG_LOCATION, on_complete_, GRPC_ERROR_CANCELLED);
1189
- // Hop back into the combiner to clean up.
1190
- chand_->combiner_->Run(
1191
- GRPC_CLOSURE_INIT(&remove_closure_, RemoveWatcherLocked, this, nullptr),
1192
- GRPC_ERROR_NONE);
1242
+ // Hop back into the work_serializer to clean up.
1243
+ chand_->work_serializer_->Run([this]() { RemoveWatcherLocked(); },
1244
+ DEBUG_LOCATION);
1193
1245
  }
1194
1246
 
1195
- void ChannelData::ExternalConnectivityWatcher::AddWatcherLocked(
1196
- void* arg, grpc_error* /*ignored*/) {
1197
- ExternalConnectivityWatcher* self =
1198
- static_cast<ExternalConnectivityWatcher*>(arg);
1199
- Closure::Run(DEBUG_LOCATION, self->watcher_timer_init_, GRPC_ERROR_NONE);
1200
- // Add new watcher.
1201
- self->chand_->state_tracker_.AddWatcher(
1202
- self->initial_state_,
1203
- OrphanablePtr<ConnectivityStateWatcherInterface>(self));
1247
+ void ChannelData::ExternalConnectivityWatcher::AddWatcherLocked() {
1248
+ Closure::Run(DEBUG_LOCATION, watcher_timer_init_, GRPC_ERROR_NONE);
1249
+ // Add new watcher. Pass the ref of the object from creation to OrphanablePtr.
1250
+ chand_->state_tracker_.AddWatcher(
1251
+ initial_state_, OrphanablePtr<ConnectivityStateWatcherInterface>(this));
1204
1252
  }
1205
1253
 
1206
- void ChannelData::ExternalConnectivityWatcher::RemoveWatcherLocked(
1207
- void* arg, grpc_error* /*ignored*/) {
1208
- ExternalConnectivityWatcher* self =
1209
- static_cast<ExternalConnectivityWatcher*>(arg);
1210
- self->chand_->state_tracker_.RemoveWatcher(self);
1254
+ void ChannelData::ExternalConnectivityWatcher::RemoveWatcherLocked() {
1255
+ chand_->state_tracker_.RemoveWatcher(this);
1211
1256
  }
1212
1257
 
1213
1258
  //
@@ -1223,28 +1268,20 @@ class ChannelData::ConnectivityWatcherAdder {
1223
1268
  initial_state_(initial_state),
1224
1269
  watcher_(std::move(watcher)) {
1225
1270
  GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "ConnectivityWatcherAdder");
1226
- chand_->combiner_->Run(
1227
- GRPC_CLOSURE_INIT(&closure_,
1228
- &ConnectivityWatcherAdder::AddWatcherLocked, this,
1229
- nullptr),
1230
- GRPC_ERROR_NONE);
1271
+ chand_->work_serializer_->Run([this]() { AddWatcherLocked(); },
1272
+ DEBUG_LOCATION);
1231
1273
  }
1232
1274
 
1233
1275
  private:
1234
- static void AddWatcherLocked(void* arg, grpc_error* /*error*/) {
1235
- ConnectivityWatcherAdder* self =
1236
- static_cast<ConnectivityWatcherAdder*>(arg);
1237
- self->chand_->state_tracker_.AddWatcher(self->initial_state_,
1238
- std::move(self->watcher_));
1239
- GRPC_CHANNEL_STACK_UNREF(self->chand_->owning_stack_,
1240
- "ConnectivityWatcherAdder");
1241
- delete self;
1276
+ void AddWatcherLocked() {
1277
+ chand_->state_tracker_.AddWatcher(initial_state_, std::move(watcher_));
1278
+ GRPC_CHANNEL_STACK_UNREF(chand_->owning_stack_, "ConnectivityWatcherAdder");
1279
+ delete this;
1242
1280
  }
1243
1281
 
1244
1282
  ChannelData* chand_;
1245
1283
  grpc_connectivity_state initial_state_;
1246
1284
  OrphanablePtr<AsyncConnectivityStateWatcherInterface> watcher_;
1247
- grpc_closure closure_;
1248
1285
  };
1249
1286
 
1250
1287
  //
@@ -1257,26 +1294,20 @@ class ChannelData::ConnectivityWatcherRemover {
1257
1294
  AsyncConnectivityStateWatcherInterface* watcher)
1258
1295
  : chand_(chand), watcher_(watcher) {
1259
1296
  GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "ConnectivityWatcherRemover");
1260
- chand_->combiner_->Run(
1261
- GRPC_CLOSURE_INIT(&closure_,
1262
- &ConnectivityWatcherRemover::RemoveWatcherLocked,
1263
- this, nullptr),
1264
- GRPC_ERROR_NONE);
1297
+ chand_->work_serializer_->Run([this]() { RemoveWatcherLocked(); },
1298
+ DEBUG_LOCATION);
1265
1299
  }
1266
1300
 
1267
1301
  private:
1268
- static void RemoveWatcherLocked(void* arg, grpc_error* /*error*/) {
1269
- ConnectivityWatcherRemover* self =
1270
- static_cast<ConnectivityWatcherRemover*>(arg);
1271
- self->chand_->state_tracker_.RemoveWatcher(self->watcher_);
1272
- GRPC_CHANNEL_STACK_UNREF(self->chand_->owning_stack_,
1302
+ void RemoveWatcherLocked() {
1303
+ chand_->state_tracker_.RemoveWatcher(watcher_);
1304
+ GRPC_CHANNEL_STACK_UNREF(chand_->owning_stack_,
1273
1305
  "ConnectivityWatcherRemover");
1274
- delete self;
1306
+ delete this;
1275
1307
  }
1276
1308
 
1277
1309
  ChannelData* chand_;
1278
1310
  AsyncConnectivityStateWatcherInterface* watcher_;
1279
- grpc_closure closure_;
1280
1311
  };
1281
1312
 
1282
1313
  //
@@ -1340,7 +1371,8 @@ class ChannelData::ClientChannelControlHelper
1340
1371
  // No-op -- we should never get this from ResolvingLoadBalancingPolicy.
1341
1372
  void RequestReresolution() override {}
1342
1373
 
1343
- void AddTraceEvent(TraceSeverity severity, StringView message) override {
1374
+ void AddTraceEvent(TraceSeverity severity,
1375
+ absl::string_view message) override {
1344
1376
  if (chand_->channelz_node_ != nullptr) {
1345
1377
  chand_->channelz_node_->AddTraceEvent(
1346
1378
  ConvertSeverityEnum(severity),
@@ -1359,6 +1391,180 @@ class ChannelData::ClientChannelControlHelper
1359
1391
  ChannelData* chand_;
1360
1392
  };
1361
1393
 
1394
+ //
1395
+ // ChannelData::ChannelConfigHelper
1396
+ //
1397
+
1398
+ // Synchronous callback from ResolvingLoadBalancingPolicy to process a
1399
+ // resolver result update.
1400
+ ChannelData::ChannelConfigHelper::ApplyServiceConfigResult
1401
+ ChannelData::ChannelConfigHelper::ApplyServiceConfig(
1402
+ const Resolver::Result& result) {
1403
+ ApplyServiceConfigResult service_config_result;
1404
+ RefCountedPtr<ServiceConfig> service_config;
1405
+ // If resolver did not return a service config or returned an invalid service
1406
+ // config, we need a fallback service config.
1407
+ if (result.service_config_error != GRPC_ERROR_NONE) {
1408
+ // If the service config was invalid, then fallback to the saved service
1409
+ // config. If there is no saved config either, use the default service
1410
+ // config.
1411
+ if (chand_->saved_service_config_ != nullptr) {
1412
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
1413
+ gpr_log(GPR_INFO,
1414
+ "chand=%p: resolver returned invalid service config. "
1415
+ "Continuing to use previous service config.",
1416
+ chand_);
1417
+ }
1418
+ service_config = chand_->saved_service_config_;
1419
+ } else if (chand_->default_service_config_ != nullptr) {
1420
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
1421
+ gpr_log(GPR_INFO,
1422
+ "chand=%p: resolver returned invalid service config. Using "
1423
+ "default service config provided by client API.",
1424
+ chand_);
1425
+ }
1426
+ service_config = chand_->default_service_config_;
1427
+ }
1428
+ } else if (result.service_config == nullptr) {
1429
+ if (chand_->default_service_config_ != nullptr) {
1430
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
1431
+ gpr_log(GPR_INFO,
1432
+ "chand=%p: resolver returned no service config. Using default "
1433
+ "service config provided by client API.",
1434
+ chand_);
1435
+ }
1436
+ service_config = chand_->default_service_config_;
1437
+ }
1438
+ } else {
1439
+ service_config = result.service_config;
1440
+ }
1441
+ service_config_result.service_config_error =
1442
+ GRPC_ERROR_REF(result.service_config_error);
1443
+ if (service_config == nullptr &&
1444
+ result.service_config_error != GRPC_ERROR_NONE) {
1445
+ service_config_result.no_valid_service_config = true;
1446
+ return service_config_result;
1447
+ }
1448
+ // Process service config.
1449
+ grpc_core::UniquePtr<char> service_config_json;
1450
+ const internal::ClientChannelGlobalParsedConfig* parsed_service_config =
1451
+ nullptr;
1452
+ if (service_config != nullptr) {
1453
+ parsed_service_config =
1454
+ static_cast<const internal::ClientChannelGlobalParsedConfig*>(
1455
+ service_config->GetGlobalParsedConfig(
1456
+ internal::ClientChannelServiceConfigParser::ParserIndex()));
1457
+ }
1458
+ // Check if the config has changed.
1459
+ service_config_result.service_config_changed =
1460
+ ((service_config == nullptr) !=
1461
+ (chand_->saved_service_config_ == nullptr)) ||
1462
+ (service_config != nullptr &&
1463
+ service_config->json_string() !=
1464
+ chand_->saved_service_config_->json_string());
1465
+ if (service_config_result.service_config_changed) {
1466
+ service_config_json.reset(gpr_strdup(
1467
+ service_config != nullptr ? service_config->json_string().c_str()
1468
+ : ""));
1469
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
1470
+ gpr_log(GPR_INFO,
1471
+ "chand=%p: resolver returned updated service config: \"%s\"",
1472
+ chand_, service_config_json.get());
1473
+ }
1474
+ // Save health check service name.
1475
+ if (service_config != nullptr) {
1476
+ chand_->health_check_service_name_.reset(
1477
+ gpr_strdup(parsed_service_config->health_check_service_name()));
1478
+ } else {
1479
+ chand_->health_check_service_name_.reset();
1480
+ }
1481
+ // Update health check service name used by existing subchannel wrappers.
1482
+ for (auto* subchannel_wrapper : chand_->subchannel_wrappers_) {
1483
+ subchannel_wrapper->UpdateHealthCheckServiceName(
1484
+ grpc_core::UniquePtr<char>(
1485
+ gpr_strdup(chand_->health_check_service_name_.get())));
1486
+ }
1487
+ // Save service config.
1488
+ chand_->saved_service_config_ = std::move(service_config);
1489
+ }
1490
+ // Find LB policy config.
1491
+ ProcessLbPolicy(result, parsed_service_config,
1492
+ &service_config_result.lb_policy_config);
1493
+ grpc_core::UniquePtr<char> lb_policy_name(
1494
+ gpr_strdup((service_config_result.lb_policy_config)->name()));
1495
+ // Swap out the data used by GetChannelInfo().
1496
+ {
1497
+ MutexLock lock(&chand_->info_mu_);
1498
+ chand_->info_lb_policy_name_ = std::move(lb_policy_name);
1499
+ if (service_config_json != nullptr) {
1500
+ chand_->info_service_config_json_ = std::move(service_config_json);
1501
+ }
1502
+ }
1503
+ // Return results.
1504
+ return service_config_result;
1505
+ }
1506
+
1507
+ void ChannelData::ChannelConfigHelper::ApplyConfigSelector(
1508
+ bool service_config_changed,
1509
+ RefCountedPtr<ConfigSelector> config_selector) {
1510
+ chand_->UpdateServiceConfigInDataPlaneLocked(service_config_changed,
1511
+ std::move(config_selector));
1512
+ }
1513
+
1514
+ void ChannelData::ChannelConfigHelper::ResolverTransientFailure(
1515
+ grpc_error* error) {
1516
+ MutexLock lock(&chand_->data_plane_mu_);
1517
+ GRPC_ERROR_UNREF(chand_->resolver_transient_failure_error_);
1518
+ chand_->resolver_transient_failure_error_ = error;
1519
+ }
1520
+
1521
+ void ChannelData::ChannelConfigHelper::ProcessLbPolicy(
1522
+ const Resolver::Result& resolver_result,
1523
+ const internal::ClientChannelGlobalParsedConfig* parsed_service_config,
1524
+ RefCountedPtr<LoadBalancingPolicy::Config>* lb_policy_config) {
1525
+ // Prefer the LB policy config found in the service config.
1526
+ if (parsed_service_config != nullptr &&
1527
+ parsed_service_config->parsed_lb_config() != nullptr) {
1528
+ *lb_policy_config = parsed_service_config->parsed_lb_config();
1529
+ return;
1530
+ }
1531
+ // Try the deprecated LB policy name from the service config.
1532
+ // If not, try the setting from channel args.
1533
+ const char* policy_name = nullptr;
1534
+ if (parsed_service_config != nullptr &&
1535
+ !parsed_service_config->parsed_deprecated_lb_policy().empty()) {
1536
+ policy_name = parsed_service_config->parsed_deprecated_lb_policy().c_str();
1537
+ } else {
1538
+ const grpc_arg* channel_arg =
1539
+ grpc_channel_args_find(resolver_result.args, GRPC_ARG_LB_POLICY_NAME);
1540
+ policy_name = grpc_channel_arg_get_string(channel_arg);
1541
+ }
1542
+ // Use pick_first if nothing was specified and we didn't select grpclb
1543
+ // above.
1544
+ if (policy_name == nullptr) policy_name = "pick_first";
1545
+ // Now that we have the policy name, construct an empty config for it.
1546
+ Json config_json = Json::Array{Json::Object{
1547
+ {policy_name, Json::Object{}},
1548
+ }};
1549
+ grpc_error* parse_error = GRPC_ERROR_NONE;
1550
+ *lb_policy_config = LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
1551
+ config_json, &parse_error);
1552
+ // The policy name came from one of three places:
1553
+ // - The deprecated loadBalancingPolicy field in the service config,
1554
+ // in which case the code in ClientChannelServiceConfigParser
1555
+ // already verified that the policy does not require a config.
1556
+ // - One of the hard-coded values here, all of which are known to not
1557
+ // require a config.
1558
+ // - A channel arg, in which case the application did something that
1559
+ // is a misuse of our API.
1560
+ // In the first two cases, these assertions will always be true. In
1561
+ // the last case, this is probably fine for now.
1562
+ // TODO(roth): If the last case becomes a problem, add better error
1563
+ // handling here.
1564
+ GPR_ASSERT(*lb_policy_config != nullptr);
1565
+ GPR_ASSERT(parse_error == GRPC_ERROR_NONE);
1566
+ }
1567
+
1362
1568
  //
1363
1569
  // ChannelData implementation
1364
1570
  //
@@ -1417,7 +1623,8 @@ ChannelData::ChannelData(grpc_channel_element_args* args, grpc_error** error)
1417
1623
  client_channel_factory_(
1418
1624
  ClientChannelFactory::GetFromChannelArgs(args->channel_args)),
1419
1625
  channelz_node_(GetChannelzNode(args->channel_args)),
1420
- combiner_(grpc_combiner_create()),
1626
+ channel_config_helper_(this),
1627
+ work_serializer_(std::make_shared<WorkSerializer>()),
1421
1628
  interested_parties_(grpc_pollset_set_create()),
1422
1629
  subchannel_pool_(GetSubchannelPool(args->channel_args)),
1423
1630
  state_tracker_("client_channel", GRPC_CHANNEL_IDLE),
@@ -1485,10 +1692,10 @@ ChannelData::~ChannelData() {
1485
1692
  }
1486
1693
  DestroyResolvingLoadBalancingPolicyLocked();
1487
1694
  grpc_channel_args_destroy(channel_args_);
1695
+ GRPC_ERROR_UNREF(resolver_transient_failure_error_);
1488
1696
  // Stop backup polling.
1489
1697
  grpc_client_channel_stop_backup_polling(interested_parties_);
1490
1698
  grpc_pollset_set_destroy(interested_parties_);
1491
- GRPC_COMBINER_UNREF(combiner_, "client_channel");
1492
1699
  GRPC_ERROR_UNREF(disconnect_error_.Load(MemoryOrder::RELAXED));
1493
1700
  gpr_mu_destroy(&info_mu_);
1494
1701
  }
@@ -1500,6 +1707,7 @@ void ChannelData::UpdateStateAndPickerLocked(
1500
1707
  if (picker_ == nullptr) {
1501
1708
  health_check_service_name_.reset();
1502
1709
  saved_service_config_.reset();
1710
+ saved_config_selector_.reset();
1503
1711
  received_first_resolver_result_ = false;
1504
1712
  }
1505
1713
  // Update connectivity state.
@@ -1522,9 +1730,11 @@ void ChannelData::UpdateStateAndPickerLocked(
1522
1730
  // - refs to subchannel wrappers in the keys of pending_subchannel_updates_
1523
1731
  // - ref stored in retry_throttle_data_
1524
1732
  // - ref stored in service_config_
1733
+ // - ref stored in config_selector_
1525
1734
  // - ownership of the existing picker in picker_
1526
1735
  RefCountedPtr<ServerRetryThrottleData> retry_throttle_data_to_unref;
1527
1736
  RefCountedPtr<ServiceConfig> service_config_to_unref;
1737
+ RefCountedPtr<ConfigSelector> config_selector_to_unref;
1528
1738
  {
1529
1739
  MutexLock lock(&data_plane_mu_);
1530
1740
  // Handle subchannel updates.
@@ -1549,6 +1759,7 @@ void ChannelData::UpdateStateAndPickerLocked(
1549
1759
  // Note: We save the objects to unref until after the lock is released.
1550
1760
  retry_throttle_data_to_unref = std::move(retry_throttle_data_);
1551
1761
  service_config_to_unref = std::move(service_config_);
1762
+ config_selector_to_unref = std::move(config_selector_);
1552
1763
  }
1553
1764
  // Re-process queued picks.
1554
1765
  for (QueuedPick* pick = queued_picks_; pick != nullptr; pick = pick->next) {
@@ -1565,24 +1776,72 @@ void ChannelData::UpdateStateAndPickerLocked(
1565
1776
  pending_subchannel_updates_.clear();
1566
1777
  }
1567
1778
 
1568
- void ChannelData::UpdateServiceConfigLocked(
1569
- RefCountedPtr<ServerRetryThrottleData> retry_throttle_data,
1570
- RefCountedPtr<ServiceConfig> service_config) {
1779
+ void ChannelData::UpdateServiceConfigInDataPlaneLocked(
1780
+ bool service_config_changed,
1781
+ RefCountedPtr<ConfigSelector> config_selector) {
1782
+ // Check if ConfigSelector has changed.
1783
+ const bool config_selector_changed =
1784
+ saved_config_selector_ != config_selector;
1785
+ saved_config_selector_ = config_selector;
1786
+ // We want to set the service config at least once, even if the
1787
+ // resolver does not return a config, because that ensures that we
1788
+ // disable retries if they are not enabled in the service config.
1789
+ // TODO(roth): Consider removing the received_first_resolver_result_ check
1790
+ // when we implement transparent retries.
1791
+ if (!service_config_changed && !config_selector_changed &&
1792
+ received_first_resolver_result_) {
1793
+ return;
1794
+ }
1795
+ received_first_resolver_result_ = true;
1796
+ // Get retry throttle data from service config.
1797
+ RefCountedPtr<ServerRetryThrottleData> retry_throttle_data;
1798
+ if (saved_service_config_ != nullptr) {
1799
+ const internal::ClientChannelGlobalParsedConfig* parsed_service_config =
1800
+ static_cast<const internal::ClientChannelGlobalParsedConfig*>(
1801
+ saved_service_config_->GetGlobalParsedConfig(
1802
+ internal::ClientChannelServiceConfigParser::ParserIndex()));
1803
+ if (parsed_service_config != nullptr) {
1804
+ absl::optional<internal::ClientChannelGlobalParsedConfig::RetryThrottling>
1805
+ retry_throttle_config = parsed_service_config->retry_throttling();
1806
+ if (retry_throttle_config.has_value()) {
1807
+ retry_throttle_data =
1808
+ internal::ServerRetryThrottleMap::GetDataForServer(
1809
+ server_name_.get(),
1810
+ retry_throttle_config.value().max_milli_tokens,
1811
+ retry_throttle_config.value().milli_token_ratio);
1812
+ }
1813
+ }
1814
+ }
1815
+ // Create default config selector if not provided by resolver.
1816
+ if (config_selector == nullptr) {
1817
+ config_selector =
1818
+ MakeRefCounted<DefaultConfigSelector>(saved_service_config_);
1819
+ }
1571
1820
  // Grab data plane lock to update service config.
1572
1821
  //
1573
1822
  // We defer unreffing the old values (and deallocating memory) until
1574
1823
  // after releasing the lock to keep the critical section small.
1824
+ RefCountedPtr<ServiceConfig> service_config_to_unref = saved_service_config_;
1825
+ RefCountedPtr<ConfigSelector> config_selector_to_unref =
1826
+ std::move(config_selector);
1575
1827
  {
1576
1828
  MutexLock lock(&data_plane_mu_);
1829
+ GRPC_ERROR_UNREF(resolver_transient_failure_error_);
1830
+ resolver_transient_failure_error_ = GRPC_ERROR_NONE;
1577
1831
  // Update service config.
1578
1832
  received_service_config_data_ = true;
1579
1833
  // Old values will be unreffed after lock is released.
1580
1834
  retry_throttle_data_.swap(retry_throttle_data);
1581
- service_config_.swap(service_config);
1582
- // Apply service config to queued picks.
1835
+ service_config_.swap(service_config_to_unref);
1836
+ config_selector_.swap(config_selector_to_unref);
1837
+ // Re-process queued picks.
1583
1838
  for (QueuedPick* pick = queued_picks_; pick != nullptr; pick = pick->next) {
1584
- CallData* calld = static_cast<CallData*>(pick->elem->call_data);
1585
- calld->MaybeApplyServiceConfigToCallLocked(pick->elem);
1839
+ grpc_call_element* elem = pick->elem;
1840
+ CallData* calld = static_cast<CallData*>(elem->call_data);
1841
+ grpc_error* error = GRPC_ERROR_NONE;
1842
+ if (calld->PickSubchannelLocked(elem, &error)) {
1843
+ calld->AsyncPickDone(elem, error);
1844
+ }
1586
1845
  }
1587
1846
  }
1588
1847
  // Old values will be unreffed after lock is released when they go out
@@ -1592,14 +1851,14 @@ void ChannelData::UpdateServiceConfigLocked(
1592
1851
  void ChannelData::CreateResolvingLoadBalancingPolicyLocked() {
1593
1852
  // Instantiate resolving LB policy.
1594
1853
  LoadBalancingPolicy::Args lb_args;
1595
- lb_args.combiner = combiner_;
1854
+ lb_args.work_serializer = work_serializer_;
1596
1855
  lb_args.channel_control_helper =
1597
1856
  absl::make_unique<ClientChannelControlHelper>(this);
1598
1857
  lb_args.args = channel_args_;
1599
1858
  grpc_core::UniquePtr<char> target_uri(gpr_strdup(target_uri_.get()));
1600
1859
  resolving_lb_policy_.reset(new ResolvingLoadBalancingPolicy(
1601
1860
  std::move(lb_args), &grpc_client_channel_routing_trace,
1602
- std::move(target_uri), ProcessResolverResultLocked, this));
1861
+ std::move(target_uri), &channel_config_helper_));
1603
1862
  grpc_pollset_set_add_pollset_set(resolving_lb_policy_->interested_parties(),
1604
1863
  interested_parties_);
1605
1864
  if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
@@ -1616,199 +1875,6 @@ void ChannelData::DestroyResolvingLoadBalancingPolicyLocked() {
1616
1875
  }
1617
1876
  }
1618
1877
 
1619
- void ChannelData::ProcessLbPolicy(
1620
- const Resolver::Result& resolver_result,
1621
- const internal::ClientChannelGlobalParsedConfig* parsed_service_config,
1622
- RefCountedPtr<LoadBalancingPolicy::Config>* lb_policy_config) {
1623
- // Prefer the LB policy config found in the service config.
1624
- if (parsed_service_config != nullptr &&
1625
- parsed_service_config->parsed_lb_config() != nullptr) {
1626
- *lb_policy_config = parsed_service_config->parsed_lb_config();
1627
- return;
1628
- }
1629
- // Try the deprecated LB policy name from the service config.
1630
- // If not, try the setting from channel args.
1631
- const char* policy_name = nullptr;
1632
- if (parsed_service_config != nullptr &&
1633
- parsed_service_config->parsed_deprecated_lb_policy() != nullptr) {
1634
- policy_name = parsed_service_config->parsed_deprecated_lb_policy();
1635
- } else {
1636
- const grpc_arg* channel_arg =
1637
- grpc_channel_args_find(resolver_result.args, GRPC_ARG_LB_POLICY_NAME);
1638
- policy_name = grpc_channel_arg_get_string(channel_arg);
1639
- }
1640
- // Special case: If at least one balancer address is present, we use
1641
- // the grpclb policy, regardless of what the resolver has returned.
1642
- bool found_balancer_address = false;
1643
- for (size_t i = 0; i < resolver_result.addresses.size(); ++i) {
1644
- const ServerAddress& address = resolver_result.addresses[i];
1645
- if (address.IsBalancer()) {
1646
- found_balancer_address = true;
1647
- break;
1648
- }
1649
- }
1650
- if (found_balancer_address) {
1651
- if (policy_name != nullptr && strcmp(policy_name, "grpclb") != 0) {
1652
- gpr_log(GPR_INFO,
1653
- "resolver requested LB policy %s but provided at least one "
1654
- "balancer address -- forcing use of grpclb LB policy",
1655
- policy_name);
1656
- }
1657
- policy_name = "grpclb";
1658
- }
1659
- // Use pick_first if nothing was specified and we didn't select grpclb
1660
- // above.
1661
- if (policy_name == nullptr) policy_name = "pick_first";
1662
- // Now that we have the policy name, construct an empty config for it.
1663
- Json config_json = Json::Array{Json::Object{
1664
- {policy_name, Json::Object{}},
1665
- }};
1666
- grpc_error* parse_error = GRPC_ERROR_NONE;
1667
- *lb_policy_config = LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
1668
- config_json, &parse_error);
1669
- // The policy name came from one of three places:
1670
- // - The deprecated loadBalancingPolicy field in the service config,
1671
- // in which case the code in ClientChannelServiceConfigParser
1672
- // already verified that the policy does not require a config.
1673
- // - One of the hard-coded values here, all of which are known to not
1674
- // require a config.
1675
- // - A channel arg, in which case the application did something that
1676
- // is a misuse of our API.
1677
- // In the first two cases, these assertions will always be true. In
1678
- // the last case, this is probably fine for now.
1679
- // TODO(roth): If the last case becomes a problem, add better error
1680
- // handling here.
1681
- GPR_ASSERT(*lb_policy_config != nullptr);
1682
- GPR_ASSERT(parse_error == GRPC_ERROR_NONE);
1683
- }
1684
-
1685
- // Synchronous callback from ResolvingLoadBalancingPolicy to process a
1686
- // resolver result update.
1687
- bool ChannelData::ProcessResolverResultLocked(
1688
- void* arg, const Resolver::Result& result,
1689
- RefCountedPtr<LoadBalancingPolicy::Config>* lb_policy_config,
1690
- grpc_error** service_config_error, bool* no_valid_service_config) {
1691
- ChannelData* chand = static_cast<ChannelData*>(arg);
1692
- RefCountedPtr<ServiceConfig> service_config;
1693
- // If resolver did not return a service config or returned an invalid service
1694
- // config, we need a fallback service config.
1695
- if (result.service_config_error != GRPC_ERROR_NONE) {
1696
- // If the service config was invalid, then fallback to the saved service
1697
- // config. If there is no saved config either, use the default service
1698
- // config.
1699
- if (chand->saved_service_config_ != nullptr) {
1700
- if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
1701
- gpr_log(GPR_INFO,
1702
- "chand=%p: resolver returned invalid service config. "
1703
- "Continuing to use previous service config.",
1704
- chand);
1705
- }
1706
- service_config = chand->saved_service_config_;
1707
- } else if (chand->default_service_config_ != nullptr) {
1708
- if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
1709
- gpr_log(GPR_INFO,
1710
- "chand=%p: resolver returned invalid service config. Using "
1711
- "default service config provided by client API.",
1712
- chand);
1713
- }
1714
- service_config = chand->default_service_config_;
1715
- }
1716
- } else if (result.service_config == nullptr) {
1717
- if (chand->default_service_config_ != nullptr) {
1718
- if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
1719
- gpr_log(GPR_INFO,
1720
- "chand=%p: resolver returned no service config. Using default "
1721
- "service config provided by client API.",
1722
- chand);
1723
- }
1724
- service_config = chand->default_service_config_;
1725
- }
1726
- } else {
1727
- service_config = result.service_config;
1728
- }
1729
- *service_config_error = GRPC_ERROR_REF(result.service_config_error);
1730
- if (service_config == nullptr &&
1731
- result.service_config_error != GRPC_ERROR_NONE) {
1732
- *no_valid_service_config = true;
1733
- return false;
1734
- }
1735
- // Process service config.
1736
- grpc_core::UniquePtr<char> service_config_json;
1737
- const internal::ClientChannelGlobalParsedConfig* parsed_service_config =
1738
- nullptr;
1739
- if (service_config != nullptr) {
1740
- parsed_service_config =
1741
- static_cast<const internal::ClientChannelGlobalParsedConfig*>(
1742
- service_config->GetGlobalParsedConfig(
1743
- internal::ClientChannelServiceConfigParser::ParserIndex()));
1744
- }
1745
- // Check if the config has changed.
1746
- const bool service_config_changed =
1747
- ((service_config == nullptr) !=
1748
- (chand->saved_service_config_ == nullptr)) ||
1749
- (service_config != nullptr &&
1750
- service_config->json_string() !=
1751
- chand->saved_service_config_->json_string());
1752
- if (service_config_changed) {
1753
- service_config_json.reset(gpr_strdup(
1754
- service_config != nullptr ? service_config->json_string().c_str()
1755
- : ""));
1756
- if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
1757
- gpr_log(GPR_INFO,
1758
- "chand=%p: resolver returned updated service config: \"%s\"",
1759
- chand, service_config_json.get());
1760
- }
1761
- // Save health check service name.
1762
- if (service_config != nullptr) {
1763
- chand->health_check_service_name_.reset(
1764
- gpr_strdup(parsed_service_config->health_check_service_name()));
1765
- } else {
1766
- chand->health_check_service_name_.reset();
1767
- }
1768
- // Update health check service name used by existing subchannel wrappers.
1769
- for (auto* subchannel_wrapper : chand->subchannel_wrappers_) {
1770
- subchannel_wrapper->UpdateHealthCheckServiceName(
1771
- grpc_core::UniquePtr<char>(
1772
- gpr_strdup(chand->health_check_service_name_.get())));
1773
- }
1774
- // Save service config.
1775
- chand->saved_service_config_ = std::move(service_config);
1776
- }
1777
- // We want to set the service config at least once. This should not really be
1778
- // needed, but we are doing it as a defensive approach. This can be removed,
1779
- // if we feel it is unnecessary.
1780
- if (service_config_changed || !chand->received_first_resolver_result_) {
1781
- chand->received_first_resolver_result_ = true;
1782
- RefCountedPtr<ServerRetryThrottleData> retry_throttle_data;
1783
- if (parsed_service_config != nullptr) {
1784
- Optional<internal::ClientChannelGlobalParsedConfig::RetryThrottling>
1785
- retry_throttle_config = parsed_service_config->retry_throttling();
1786
- if (retry_throttle_config.has_value()) {
1787
- retry_throttle_data =
1788
- internal::ServerRetryThrottleMap::GetDataForServer(
1789
- chand->server_name_.get(),
1790
- retry_throttle_config.value().max_milli_tokens,
1791
- retry_throttle_config.value().milli_token_ratio);
1792
- }
1793
- }
1794
- chand->UpdateServiceConfigLocked(std::move(retry_throttle_data),
1795
- chand->saved_service_config_);
1796
- }
1797
- chand->ProcessLbPolicy(result, parsed_service_config, lb_policy_config);
1798
- grpc_core::UniquePtr<char> lb_policy_name(
1799
- gpr_strdup((*lb_policy_config)->name()));
1800
- // Swap out the data used by GetChannelInfo().
1801
- {
1802
- MutexLock lock(&chand->info_mu_);
1803
- chand->info_lb_policy_name_ = std::move(lb_policy_name);
1804
- if (service_config_json != nullptr) {
1805
- chand->info_service_config_json_ = std::move(service_config_json);
1806
- }
1807
- }
1808
- // Return results.
1809
- return service_config_changed;
1810
- }
1811
-
1812
1878
  grpc_error* ChannelData::DoPingLocked(grpc_transport_op* op) {
1813
1879
  if (state_tracker_.state() != GRPC_CHANNEL_READY) {
1814
1880
  return GRPC_ERROR_CREATE_FROM_STATIC_STRING("channel not connected");
@@ -1832,22 +1898,18 @@ grpc_error* ChannelData::DoPingLocked(grpc_transport_op* op) {
1832
1898
  return result.error;
1833
1899
  }
1834
1900
 
1835
- void ChannelData::StartTransportOpLocked(void* arg, grpc_error* /*ignored*/) {
1836
- grpc_transport_op* op = static_cast<grpc_transport_op*>(arg);
1837
- grpc_channel_element* elem =
1838
- static_cast<grpc_channel_element*>(op->handler_private.extra_arg);
1839
- ChannelData* chand = static_cast<ChannelData*>(elem->channel_data);
1901
+ void ChannelData::StartTransportOpLocked(grpc_transport_op* op) {
1840
1902
  // Connectivity watch.
1841
1903
  if (op->start_connectivity_watch != nullptr) {
1842
- chand->state_tracker_.AddWatcher(op->start_connectivity_watch_state,
1843
- std::move(op->start_connectivity_watch));
1904
+ state_tracker_.AddWatcher(op->start_connectivity_watch_state,
1905
+ std::move(op->start_connectivity_watch));
1844
1906
  }
1845
1907
  if (op->stop_connectivity_watch != nullptr) {
1846
- chand->state_tracker_.RemoveWatcher(op->stop_connectivity_watch);
1908
+ state_tracker_.RemoveWatcher(op->stop_connectivity_watch);
1847
1909
  }
1848
1910
  // Ping.
1849
1911
  if (op->send_ping.on_initiate != nullptr || op->send_ping.on_ack != nullptr) {
1850
- grpc_error* error = chand->DoPingLocked(op);
1912
+ grpc_error* error = DoPingLocked(op);
1851
1913
  if (error != GRPC_ERROR_NONE) {
1852
1914
  ExecCtx::Run(DEBUG_LOCATION, op->send_ping.on_initiate,
1853
1915
  GRPC_ERROR_REF(error));
@@ -1859,40 +1921,39 @@ void ChannelData::StartTransportOpLocked(void* arg, grpc_error* /*ignored*/) {
1859
1921
  }
1860
1922
  // Reset backoff.
1861
1923
  if (op->reset_connect_backoff) {
1862
- if (chand->resolving_lb_policy_ != nullptr) {
1863
- chand->resolving_lb_policy_->ResetBackoffLocked();
1924
+ if (resolving_lb_policy_ != nullptr) {
1925
+ resolving_lb_policy_->ResetBackoffLocked();
1864
1926
  }
1865
1927
  }
1866
1928
  // Disconnect or enter IDLE.
1867
1929
  if (op->disconnect_with_error != GRPC_ERROR_NONE) {
1868
1930
  if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
1869
- gpr_log(GPR_INFO, "chand=%p: disconnect_with_error: %s", chand,
1931
+ gpr_log(GPR_INFO, "chand=%p: disconnect_with_error: %s", this,
1870
1932
  grpc_error_string(op->disconnect_with_error));
1871
1933
  }
1872
- chand->DestroyResolvingLoadBalancingPolicyLocked();
1934
+ DestroyResolvingLoadBalancingPolicyLocked();
1873
1935
  intptr_t value;
1874
1936
  if (grpc_error_get_int(op->disconnect_with_error,
1875
1937
  GRPC_ERROR_INT_CHANNEL_CONNECTIVITY_STATE, &value) &&
1876
1938
  static_cast<grpc_connectivity_state>(value) == GRPC_CHANNEL_IDLE) {
1877
- if (chand->disconnect_error() == GRPC_ERROR_NONE) {
1939
+ if (disconnect_error() == GRPC_ERROR_NONE) {
1878
1940
  // Enter IDLE state.
1879
- chand->UpdateStateAndPickerLocked(GRPC_CHANNEL_IDLE,
1880
- "channel entering IDLE", nullptr);
1941
+ UpdateStateAndPickerLocked(GRPC_CHANNEL_IDLE, "channel entering IDLE",
1942
+ nullptr);
1881
1943
  }
1882
1944
  GRPC_ERROR_UNREF(op->disconnect_with_error);
1883
1945
  } else {
1884
1946
  // Disconnect.
1885
- GPR_ASSERT(chand->disconnect_error_.Load(MemoryOrder::RELAXED) ==
1947
+ GPR_ASSERT(disconnect_error_.Load(MemoryOrder::RELAXED) ==
1886
1948
  GRPC_ERROR_NONE);
1887
- chand->disconnect_error_.Store(op->disconnect_with_error,
1888
- MemoryOrder::RELEASE);
1889
- chand->UpdateStateAndPickerLocked(
1949
+ disconnect_error_.Store(op->disconnect_with_error, MemoryOrder::RELEASE);
1950
+ UpdateStateAndPickerLocked(
1890
1951
  GRPC_CHANNEL_SHUTDOWN, "shutdown from API",
1891
1952
  absl::make_unique<LoadBalancingPolicy::TransientFailurePicker>(
1892
1953
  GRPC_ERROR_REF(op->disconnect_with_error)));
1893
1954
  }
1894
1955
  }
1895
- GRPC_CHANNEL_STACK_UNREF(chand->owning_stack_, "start_transport_op");
1956
+ GRPC_CHANNEL_STACK_UNREF(owning_stack_, "start_transport_op");
1896
1957
  ExecCtx::Run(DEBUG_LOCATION, op->on_consumed, GRPC_ERROR_NONE);
1897
1958
  }
1898
1959
 
@@ -1904,13 +1965,10 @@ void ChannelData::StartTransportOp(grpc_channel_element* elem,
1904
1965
  if (op->bind_pollset != nullptr) {
1905
1966
  grpc_pollset_set_add_pollset(chand->interested_parties_, op->bind_pollset);
1906
1967
  }
1907
- // Pop into control plane combiner for remaining ops.
1908
- op->handler_private.extra_arg = elem;
1968
+ // Pop into control plane work_serializer for remaining ops.
1909
1969
  GRPC_CHANNEL_STACK_REF(chand->owning_stack_, "start_transport_op");
1910
- chand->combiner_->Run(
1911
- GRPC_CLOSURE_INIT(&op->handler_private.closure,
1912
- ChannelData::StartTransportOpLocked, op, nullptr),
1913
- GRPC_ERROR_NONE);
1970
+ chand->work_serializer_->Run(
1971
+ [chand, op]() { chand->StartTransportOpLocked(op); }, DEBUG_LOCATION);
1914
1972
  }
1915
1973
 
1916
1974
  void ChannelData::GetChannelInfo(grpc_channel_element* elem,
@@ -1961,14 +2019,13 @@ ChannelData::GetConnectedSubchannelInDataPlane(
1961
2019
  return connected_subchannel->Ref();
1962
2020
  }
1963
2021
 
1964
- void ChannelData::TryToConnectLocked(void* arg, grpc_error* /*error_ignored*/) {
1965
- auto* chand = static_cast<ChannelData*>(arg);
1966
- if (chand->resolving_lb_policy_ != nullptr) {
1967
- chand->resolving_lb_policy_->ExitIdleLocked();
2022
+ void ChannelData::TryToConnectLocked() {
2023
+ if (resolving_lb_policy_ != nullptr) {
2024
+ resolving_lb_policy_->ExitIdleLocked();
1968
2025
  } else {
1969
- chand->CreateResolvingLoadBalancingPolicyLocked();
2026
+ CreateResolvingLoadBalancingPolicyLocked();
1970
2027
  }
1971
- GRPC_CHANNEL_STACK_UNREF(chand->owning_stack_, "TryToConnect");
2028
+ GRPC_CHANNEL_STACK_UNREF(owning_stack_, "TryToConnect");
1972
2029
  }
1973
2030
 
1974
2031
  grpc_connectivity_state ChannelData::CheckConnectivityState(
@@ -1976,8 +2033,7 @@ grpc_connectivity_state ChannelData::CheckConnectivityState(
1976
2033
  grpc_connectivity_state out = state_tracker_.state();
1977
2034
  if (out == GRPC_CHANNEL_IDLE && try_to_connect) {
1978
2035
  GRPC_CHANNEL_STACK_REF(owning_stack_, "TryToConnect");
1979
- combiner_->Run(GRPC_CLOSURE_CREATE(TryToConnectLocked, this, nullptr),
1980
- GRPC_ERROR_NONE);
2036
+ work_serializer_->Run([this]() { TryToConnectLocked(); }, DEBUG_LOCATION);
1981
2037
  }
1982
2038
  return out;
1983
2039
  }
@@ -2283,10 +2339,32 @@ void CallData::FreeCachedSendOpDataForCompletedBatch(
2283
2339
  void CallData::RecvTrailingMetadataReadyForLoadBalancingPolicy(
2284
2340
  void* arg, grpc_error* error) {
2285
2341
  CallData* calld = static_cast<CallData*>(arg);
2342
+ // Set error if call did not succeed.
2343
+ grpc_error* error_for_lb = GRPC_ERROR_NONE;
2344
+ if (error != GRPC_ERROR_NONE) {
2345
+ error_for_lb = error;
2346
+ } else {
2347
+ const auto& fields = calld->recv_trailing_metadata_->idx.named;
2348
+ GPR_ASSERT(fields.grpc_status != nullptr);
2349
+ grpc_status_code status =
2350
+ grpc_get_status_code_from_metadata(fields.grpc_status->md);
2351
+ std::string msg;
2352
+ if (status != GRPC_STATUS_OK) {
2353
+ error_for_lb = grpc_error_set_int(
2354
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("call failed"),
2355
+ GRPC_ERROR_INT_GRPC_STATUS, status);
2356
+ if (fields.grpc_message != nullptr) {
2357
+ error_for_lb = grpc_error_set_str(
2358
+ error_for_lb, GRPC_ERROR_STR_GRPC_MESSAGE,
2359
+ grpc_slice_ref_internal(GRPC_MDVALUE(fields.grpc_message->md)));
2360
+ }
2361
+ }
2362
+ }
2286
2363
  // Invoke callback to LB policy.
2287
2364
  Metadata trailing_metadata(calld, calld->recv_trailing_metadata_);
2288
- calld->lb_recv_trailing_metadata_ready_(error, &trailing_metadata,
2365
+ calld->lb_recv_trailing_metadata_ready_(error_for_lb, &trailing_metadata,
2289
2366
  &calld->lb_call_state_);
2367
+ if (error == GRPC_ERROR_NONE) GRPC_ERROR_UNREF(error_for_lb);
2290
2368
  // Chain to original callback.
2291
2369
  Closure::Run(DEBUG_LOCATION, calld->original_recv_trailing_metadata_ready_,
2292
2370
  GRPC_ERROR_REF(error));
@@ -2839,6 +2917,7 @@ void CallData::RecvInitialMetadataReady(void* arg, grpc_error* error) {
2839
2917
  }
2840
2918
  // Received valid initial metadata, so commit the call.
2841
2919
  calld->RetryCommit(elem, retry_state);
2920
+ calld->MaybeInvokeConfigSelectorCommitCallback();
2842
2921
  // Invoke the callback to return the result to the surface.
2843
2922
  // Manually invoking a callback function; it does not take ownership of error.
2844
2923
  calld->InvokeRecvInitialMetadataCallback(batch_data, error);
@@ -2925,6 +3004,7 @@ void CallData::RecvMessageReady(void* arg, grpc_error* error) {
2925
3004
  }
2926
3005
  // Received a valid message, so commit the call.
2927
3006
  calld->RetryCommit(elem, retry_state);
3007
+ calld->MaybeInvokeConfigSelectorCommitCallback();
2928
3008
  // Invoke the callback to return the result to the surface.
2929
3009
  // Manually invoking a callback function; it does not take ownership of error.
2930
3010
  calld->InvokeRecvMessageCallback(batch_data, error);
@@ -3126,6 +3206,7 @@ void CallData::RecvTrailingMetadataReady(void* arg, grpc_error* error) {
3126
3206
  }
3127
3207
  // Not retrying, so commit the call.
3128
3208
  calld->RetryCommit(elem, retry_state);
3209
+ calld->MaybeInvokeConfigSelectorCommitCallback();
3129
3210
  // Run any necessary closures.
3130
3211
  calld->RunClosuresForCompletedCall(batch_data, GRPC_ERROR_REF(error));
3131
3212
  }
@@ -3203,10 +3284,9 @@ void CallData::OnComplete(void* arg, grpc_error* error) {
3203
3284
  ChannelData* chand = static_cast<ChannelData*>(elem->channel_data);
3204
3285
  CallData* calld = static_cast<CallData*>(elem->call_data);
3205
3286
  if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
3206
- char* batch_str = grpc_transport_stream_op_batch_string(&batch_data->batch);
3207
3287
  gpr_log(GPR_INFO, "chand=%p calld=%p: got on_complete, error=%s, batch=%s",
3208
- chand, calld, grpc_error_string(error), batch_str);
3209
- gpr_free(batch_str);
3288
+ chand, calld, grpc_error_string(error),
3289
+ grpc_transport_stream_op_batch_string(&batch_data->batch).c_str());
3210
3290
  }
3211
3291
  SubchannelCallRetryState* retry_state =
3212
3292
  static_cast<SubchannelCallRetryState*>(
@@ -3279,10 +3359,8 @@ void CallData::AddClosureForSubchannelBatch(
3279
3359
  GRPC_CLOSURE_INIT(&batch->handler_private.closure, StartBatchInCallCombiner,
3280
3360
  batch, grpc_schedule_on_exec_ctx);
3281
3361
  if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
3282
- char* batch_str = grpc_transport_stream_op_batch_string(batch);
3283
3362
  gpr_log(GPR_INFO, "chand=%p calld=%p: starting subchannel batch: %s", chand,
3284
- this, batch_str);
3285
- gpr_free(batch_str);
3363
+ this, grpc_transport_stream_op_batch_string(batch).c_str());
3286
3364
  }
3287
3365
  closures->Add(&batch->handler_private.closure, GRPC_ERROR_NONE,
3288
3366
  "start_subchannel_batch");
@@ -3751,7 +3829,7 @@ class CallData::QueuedPickCanceller {
3751
3829
  }
3752
3830
  if (calld->pick_canceller_ == self && error != GRPC_ERROR_NONE) {
3753
3831
  // Remove pick from list of queued picks.
3754
- calld->RemoveCallFromQueuedPicksLocked(self->elem_);
3832
+ calld->MaybeRemoveCallFromQueuedPicksLocked(self->elem_);
3755
3833
  // Fail pending batches on the call.
3756
3834
  calld->PendingBatchesFail(self->elem_, GRPC_ERROR_REF(error),
3757
3835
  YieldCallCombinerIfPendingBatchesFound);
@@ -3764,7 +3842,8 @@ class CallData::QueuedPickCanceller {
3764
3842
  grpc_closure closure_;
3765
3843
  };
3766
3844
 
3767
- void CallData::RemoveCallFromQueuedPicksLocked(grpc_call_element* elem) {
3845
+ void CallData::MaybeRemoveCallFromQueuedPicksLocked(grpc_call_element* elem) {
3846
+ if (!pick_queued_) return;
3768
3847
  auto* chand = static_cast<ChannelData*>(elem->channel_data);
3769
3848
  if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
3770
3849
  gpr_log(GPR_INFO, "chand=%p calld=%p: removing from queued picks list",
@@ -3776,7 +3855,8 @@ void CallData::RemoveCallFromQueuedPicksLocked(grpc_call_element* elem) {
3776
3855
  pick_canceller_ = nullptr;
3777
3856
  }
3778
3857
 
3779
- void CallData::AddCallToQueuedPicksLocked(grpc_call_element* elem) {
3858
+ void CallData::MaybeAddCallToQueuedPicksLocked(grpc_call_element* elem) {
3859
+ if (pick_queued_) return;
3780
3860
  auto* chand = static_cast<ChannelData*>(elem->channel_data);
3781
3861
  if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
3782
3862
  gpr_log(GPR_INFO, "chand=%p calld=%p: adding to queued picks list", chand,
@@ -3789,67 +3869,77 @@ void CallData::AddCallToQueuedPicksLocked(grpc_call_element* elem) {
3789
3869
  pick_canceller_ = new QueuedPickCanceller(elem);
3790
3870
  }
3791
3871
 
3792
- void CallData::ApplyServiceConfigToCallLocked(grpc_call_element* elem) {
3872
+ grpc_error* CallData::ApplyServiceConfigToCallLocked(
3873
+ grpc_call_element* elem, grpc_metadata_batch* initial_metadata) {
3793
3874
  ChannelData* chand = static_cast<ChannelData*>(elem->channel_data);
3794
3875
  if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
3795
3876
  gpr_log(GPR_INFO, "chand=%p calld=%p: applying service config to call",
3796
3877
  chand, this);
3797
3878
  }
3798
- // Store a ref to the service_config in service_config_call_data_. Also, save
3799
- // a pointer to this in the call_context so that all future filters can access
3800
- // it.
3801
- service_config_call_data_ =
3802
- ServiceConfig::CallData(chand->service_config(), path_);
3803
- if (service_config_call_data_.service_config() != nullptr) {
3804
- call_context_[GRPC_CONTEXT_SERVICE_CONFIG_CALL_DATA].value =
3805
- &service_config_call_data_;
3879
+ ConfigSelector* config_selector = chand->config_selector();
3880
+ auto service_config = chand->service_config();
3881
+ if (service_config != nullptr) {
3882
+ // Use the ConfigSelector to determine the config for the call.
3883
+ ConfigSelector::CallConfig call_config =
3884
+ config_selector->GetCallConfig({&path_, initial_metadata, arena_});
3885
+ if (call_config.error != GRPC_ERROR_NONE) return call_config.error;
3886
+ call_attributes_ = std::move(call_config.call_attributes);
3887
+ on_call_committed_ = std::move(call_config.on_call_committed);
3888
+ // Create a ServiceConfigCallData for the call. This stores a ref to the
3889
+ // ServiceConfig and caches the right set of parsed configs to use for
3890
+ // the call. The MethodConfig will store itself in the call context,
3891
+ // so that it can be accessed by filters in the subchannel, and it
3892
+ // will be cleaned up when the call ends.
3893
+ auto* service_config_call_data = arena_->New<ServiceConfigCallData>(
3894
+ std::move(service_config), call_config.method_configs, call_context_);
3895
+ // Apply our own method params to the call.
3806
3896
  method_params_ = static_cast<ClientChannelMethodParsedConfig*>(
3807
- service_config_call_data_.GetMethodParsedConfig(
3897
+ service_config_call_data->GetMethodParsedConfig(
3808
3898
  internal::ClientChannelServiceConfigParser::ParserIndex()));
3809
- }
3810
- retry_throttle_data_ = chand->retry_throttle_data();
3811
- if (method_params_ != nullptr) {
3812
- // If the deadline from the service config is shorter than the one
3813
- // from the client API, reset the deadline timer.
3814
- if (chand->deadline_checking_enabled() && method_params_->timeout() != 0) {
3815
- const grpc_millis per_method_deadline =
3816
- grpc_cycle_counter_to_millis_round_up(call_start_time_) +
3817
- method_params_->timeout();
3818
- if (per_method_deadline < deadline_) {
3819
- deadline_ = per_method_deadline;
3820
- grpc_deadline_state_reset(elem, deadline_);
3899
+ if (method_params_ != nullptr) {
3900
+ // If the deadline from the service config is shorter than the one
3901
+ // from the client API, reset the deadline timer.
3902
+ if (chand->deadline_checking_enabled() &&
3903
+ method_params_->timeout() != 0) {
3904
+ const grpc_millis per_method_deadline =
3905
+ grpc_cycle_counter_to_millis_round_up(call_start_time_) +
3906
+ method_params_->timeout();
3907
+ if (per_method_deadline < deadline_) {
3908
+ deadline_ = per_method_deadline;
3909
+ grpc_deadline_state_reset(elem, deadline_);
3910
+ }
3821
3911
  }
3822
- }
3823
- // If the service config set wait_for_ready and the application
3824
- // did not explicitly set it, use the value from the service config.
3825
- uint32_t* send_initial_metadata_flags =
3826
- &pending_batches_[0]
3827
- .batch->payload->send_initial_metadata.send_initial_metadata_flags;
3828
- if (method_params_->wait_for_ready().has_value() &&
3829
- !(*send_initial_metadata_flags &
3830
- GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET)) {
3831
- if (method_params_->wait_for_ready().value()) {
3832
- *send_initial_metadata_flags |= GRPC_INITIAL_METADATA_WAIT_FOR_READY;
3833
- } else {
3834
- *send_initial_metadata_flags &= ~GRPC_INITIAL_METADATA_WAIT_FOR_READY;
3912
+ // If the service config set wait_for_ready and the application
3913
+ // did not explicitly set it, use the value from the service config.
3914
+ uint32_t* send_initial_metadata_flags =
3915
+ &pending_batches_[0]
3916
+ .batch->payload->send_initial_metadata
3917
+ .send_initial_metadata_flags;
3918
+ if (method_params_->wait_for_ready().has_value() &&
3919
+ !(*send_initial_metadata_flags &
3920
+ GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET)) {
3921
+ if (method_params_->wait_for_ready().value()) {
3922
+ *send_initial_metadata_flags |= GRPC_INITIAL_METADATA_WAIT_FOR_READY;
3923
+ } else {
3924
+ *send_initial_metadata_flags &= ~GRPC_INITIAL_METADATA_WAIT_FOR_READY;
3925
+ }
3835
3926
  }
3836
3927
  }
3928
+ // Set retry throttle data for call.
3929
+ retry_throttle_data_ = chand->retry_throttle_data();
3837
3930
  }
3838
3931
  // If no retry policy, disable retries.
3839
3932
  // TODO(roth): Remove this when adding support for transparent retries.
3840
3933
  if (method_params_ == nullptr || method_params_->retry_policy() == nullptr) {
3841
3934
  enable_retries_ = false;
3842
3935
  }
3936
+ return GRPC_ERROR_NONE;
3843
3937
  }
3844
3938
 
3845
- void CallData::MaybeApplyServiceConfigToCallLocked(grpc_call_element* elem) {
3846
- ChannelData* chand = static_cast<ChannelData*>(elem->channel_data);
3847
- // Apply service config data to the call only once, and only if the
3848
- // channel has the data available.
3849
- if (GPR_LIKELY(chand->received_service_config_data() &&
3850
- !service_config_applied_)) {
3851
- service_config_applied_ = true;
3852
- ApplyServiceConfigToCallLocked(elem);
3939
+ void CallData::MaybeInvokeConfigSelectorCommitCallback() {
3940
+ if (on_call_committed_ != nullptr) {
3941
+ on_call_committed_();
3942
+ on_call_committed_ = nullptr;
3853
3943
  }
3854
3944
  }
3855
3945
 
@@ -3889,15 +3979,66 @@ bool CallData::PickSubchannelLocked(grpc_call_element* elem,
3889
3979
  // The picker being null means that the channel is currently in IDLE state.
3890
3980
  // The incoming call will make the channel exit IDLE.
3891
3981
  if (chand->picker() == nullptr) {
3892
- // Bounce into the control plane combiner to exit IDLE.
3893
- chand->CheckConnectivityState(/*try_to_connect=*/true);
3982
+ GRPC_CHANNEL_STACK_REF(chand->owning_stack(), "PickSubchannelLocked");
3983
+ // Bounce into the control plane work serializer to exit IDLE. Since we are
3984
+ // holding on to the data plane mutex here, we offload it on the ExecCtx so
3985
+ // that we don't deadlock with ourselves.
3986
+ ExecCtx::Run(
3987
+ DEBUG_LOCATION,
3988
+ GRPC_CLOSURE_CREATE(
3989
+ [](void* arg, grpc_error* /*error*/) {
3990
+ auto* chand = static_cast<ChannelData*>(arg);
3991
+ chand->work_serializer()->Run(
3992
+ [chand]() {
3993
+ chand->CheckConnectivityState(/*try_to_connect=*/true);
3994
+ GRPC_CHANNEL_STACK_UNREF(chand->owning_stack(),
3995
+ "PickSubchannelLocked");
3996
+ },
3997
+ DEBUG_LOCATION);
3998
+ },
3999
+ chand, nullptr),
4000
+ GRPC_ERROR_NONE);
3894
4001
  // Queue the pick, so that it will be attempted once the channel
3895
4002
  // becomes connected.
3896
- AddCallToQueuedPicksLocked(elem);
4003
+ MaybeAddCallToQueuedPicksLocked(elem);
3897
4004
  return false;
3898
4005
  }
3899
- // Apply service config to call if needed.
3900
- MaybeApplyServiceConfigToCallLocked(elem);
4006
+ grpc_metadata_batch* initial_metadata_batch =
4007
+ seen_send_initial_metadata_
4008
+ ? &send_initial_metadata_
4009
+ : pending_batches_[0]
4010
+ .batch->payload->send_initial_metadata.send_initial_metadata;
4011
+ // Grab initial metadata flags so that we can check later if the call has
4012
+ // wait_for_ready enabled.
4013
+ const uint32_t send_initial_metadata_flags =
4014
+ seen_send_initial_metadata_ ? send_initial_metadata_flags_
4015
+ : pending_batches_[0]
4016
+ .batch->payload->send_initial_metadata
4017
+ .send_initial_metadata_flags;
4018
+ // Avoid picking if we haven't yet received service config data.
4019
+ if (GPR_UNLIKELY(!chand->received_service_config_data())) {
4020
+ // If the resolver returned transient failure before returning the
4021
+ // first service config, fail any non-wait_for_ready calls.
4022
+ grpc_error* resolver_error = chand->resolver_transient_failure_error();
4023
+ if (resolver_error != GRPC_ERROR_NONE &&
4024
+ (send_initial_metadata_flags & GRPC_INITIAL_METADATA_WAIT_FOR_READY) ==
4025
+ 0) {
4026
+ MaybeRemoveCallFromQueuedPicksLocked(elem);
4027
+ *error = GRPC_ERROR_REF(resolver_error);
4028
+ return true;
4029
+ }
4030
+ // Either the resolver has not yet returned a result, or it has
4031
+ // returned transient failure but the call is wait_for_ready. In
4032
+ // either case, queue the call.
4033
+ MaybeAddCallToQueuedPicksLocked(elem);
4034
+ return false;
4035
+ }
4036
+ // Apply service config to call if not yet applied.
4037
+ if (GPR_LIKELY(!service_config_applied_)) {
4038
+ service_config_applied_ = true;
4039
+ *error = ApplyServiceConfigToCallLocked(elem, initial_metadata_batch);
4040
+ if (*error != GRPC_ERROR_NONE) return true;
4041
+ }
3901
4042
  // If this is a retry, use the send_initial_metadata payload that
3902
4043
  // we've cached; otherwise, use the pending batch. The
3903
4044
  // send_initial_metadata batch will be the first pending batch in the
@@ -3909,21 +4050,10 @@ bool CallData::PickSubchannelLocked(grpc_call_element* elem,
3909
4050
  // subchannel's copy of the metadata batch (which is copied for each
3910
4051
  // attempt) to the LB policy instead the one from the parent channel.
3911
4052
  LoadBalancingPolicy::PickArgs pick_args;
4053
+ pick_args.path = StringViewFromSlice(path_);
3912
4054
  pick_args.call_state = &lb_call_state_;
3913
- Metadata initial_metadata(
3914
- this,
3915
- seen_send_initial_metadata_
3916
- ? &send_initial_metadata_
3917
- : pending_batches_[0]
3918
- .batch->payload->send_initial_metadata.send_initial_metadata);
4055
+ Metadata initial_metadata(this, initial_metadata_batch);
3919
4056
  pick_args.initial_metadata = &initial_metadata;
3920
- // Grab initial metadata flags so that we can check later if the call has
3921
- // wait_for_ready enabled.
3922
- const uint32_t send_initial_metadata_flags =
3923
- seen_send_initial_metadata_ ? send_initial_metadata_flags_
3924
- : pending_batches_[0]
3925
- .batch->payload->send_initial_metadata
3926
- .send_initial_metadata_flags;
3927
4057
  // Attempt pick.
3928
4058
  auto result = chand->picker()->Pick(pick_args);
3929
4059
  if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
@@ -3938,7 +4068,8 @@ bool CallData::PickSubchannelLocked(grpc_call_element* elem,
3938
4068
  grpc_error* disconnect_error = chand->disconnect_error();
3939
4069
  if (disconnect_error != GRPC_ERROR_NONE) {
3940
4070
  GRPC_ERROR_UNREF(result.error);
3941
- if (pick_queued_) RemoveCallFromQueuedPicksLocked(elem);
4071
+ MaybeRemoveCallFromQueuedPicksLocked(elem);
4072
+ MaybeInvokeConfigSelectorCommitCallback();
3942
4073
  *error = GRPC_ERROR_REF(disconnect_error);
3943
4074
  return true;
3944
4075
  }
@@ -3959,8 +4090,9 @@ bool CallData::PickSubchannelLocked(grpc_call_element* elem,
3959
4090
  "Failed to pick subchannel", &result.error, 1);
3960
4091
  GRPC_ERROR_UNREF(result.error);
3961
4092
  *error = new_error;
4093
+ MaybeInvokeConfigSelectorCommitCallback();
3962
4094
  }
3963
- if (pick_queued_) RemoveCallFromQueuedPicksLocked(elem);
4095
+ MaybeRemoveCallFromQueuedPicksLocked(elem);
3964
4096
  return !retried;
3965
4097
  }
3966
4098
  // If wait_for_ready is true, then queue to retry when we get a new
@@ -3969,20 +4101,24 @@ bool CallData::PickSubchannelLocked(grpc_call_element* elem,
3969
4101
  }
3970
4102
  // Fallthrough
3971
4103
  case LoadBalancingPolicy::PickResult::PICK_QUEUE:
3972
- if (!pick_queued_) AddCallToQueuedPicksLocked(elem);
4104
+ MaybeAddCallToQueuedPicksLocked(elem);
3973
4105
  return false;
3974
4106
  default: // PICK_COMPLETE
3975
- if (pick_queued_) RemoveCallFromQueuedPicksLocked(elem);
4107
+ MaybeRemoveCallFromQueuedPicksLocked(elem);
3976
4108
  // Handle drops.
3977
4109
  if (GPR_UNLIKELY(result.subchannel == nullptr)) {
3978
- result.error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
3979
- "Call dropped by load balancing policy");
4110
+ result.error = grpc_error_set_int(
4111
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING(
4112
+ "Call dropped by load balancing policy"),
4113
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
4114
+ MaybeInvokeConfigSelectorCommitCallback();
3980
4115
  } else {
3981
4116
  // Grab a ref to the connected subchannel while we're still
3982
4117
  // holding the data plane mutex.
3983
4118
  connected_subchannel_ =
3984
4119
  chand->GetConnectedSubchannelInDataPlane(result.subchannel.get());
3985
4120
  GPR_ASSERT(connected_subchannel_ != nullptr);
4121
+ if (retry_committed_) MaybeInvokeConfigSelectorCommitCallback();
3986
4122
  }
3987
4123
  lb_recv_trailing_metadata_ready_ = result.recv_trailing_metadata_ready;
3988
4124
  *error = result.error;