grpc 1.32.0 → 1.35.0

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

Potentially problematic release.


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

Files changed (938) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +1078 -3049
  3. data/etc/roots.pem +257 -573
  4. data/include/grpc/compression.h +1 -1
  5. data/include/grpc/grpc.h +15 -7
  6. data/include/grpc/grpc_security.h +222 -171
  7. data/include/grpc/impl/codegen/atm_windows.h +4 -0
  8. data/include/grpc/impl/codegen/byte_buffer.h +1 -1
  9. data/include/grpc/impl/codegen/grpc_types.h +10 -8
  10. data/include/grpc/impl/codegen/log.h +0 -2
  11. data/include/grpc/impl/codegen/port_platform.h +22 -55
  12. data/include/grpc/impl/codegen/sync_windows.h +4 -0
  13. data/include/grpc/slice_buffer.h +3 -3
  14. data/include/grpc/support/sync.h +3 -3
  15. data/include/grpc/support/time.h +7 -7
  16. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -4
  17. data/src/core/ext/filters/client_channel/client_channel.cc +2776 -1529
  18. data/src/core/ext/filters/client_channel/client_channel.h +0 -4
  19. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  20. data/src/core/ext/filters/client_channel/config_selector.cc +0 -4
  21. data/src/core/ext/filters/client_channel/config_selector.h +40 -8
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +186 -0
  23. data/src/core/ext/filters/client_channel/dynamic_filters.h +99 -0
  24. data/src/core/ext/filters/client_channel/health/health_check_client.cc +10 -7
  25. data/src/core/ext/filters/client_channel/health/health_check_client.h +4 -4
  26. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +5 -6
  27. data/src/core/ext/filters/client_channel/http_proxy.cc +21 -20
  28. data/src/core/ext/filters/client_channel/lb_policy.cc +6 -2
  29. data/src/core/ext/filters/client_channel/lb_policy.h +6 -7
  30. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +48 -35
  31. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +7 -5
  32. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +4 -3
  33. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +1 -1
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +201 -190
  35. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +3 -1
  36. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +3 -3
  37. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +1 -1
  38. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +4 -4
  39. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +50 -20
  40. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +5 -5
  41. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +14 -34
  42. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +6 -6
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +341 -127
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +52 -24
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +24 -0
  46. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +812 -0
  47. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +722 -0
  48. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +1262 -0
  49. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +8 -1
  50. data/src/core/ext/filters/client_channel/resolver.cc +3 -1
  51. data/src/core/ext/filters/client_channel/resolver.h +4 -1
  52. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +9 -16
  53. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -32
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +3 -3
  55. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +454 -16
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -0
  57. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +7 -10
  58. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +3 -3
  59. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +1 -1
  60. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +34 -27
  61. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +618 -366
  62. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +28 -0
  63. data/src/core/ext/filters/client_channel/resolver_factory.h +6 -6
  64. data/src/core/ext/filters/client_channel/resolver_registry.cc +40 -39
  65. data/src/core/ext/filters/client_channel/resolver_registry.h +2 -2
  66. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +29 -74
  67. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +12 -10
  68. data/src/core/ext/filters/client_channel/retry_throttle.cc +5 -3
  69. data/src/core/ext/filters/client_channel/retry_throttle.h +4 -2
  70. data/src/core/ext/filters/client_channel/server_address.cc +80 -0
  71. data/src/core/ext/filters/client_channel/server_address.h +21 -36
  72. data/src/core/ext/filters/client_channel/service_config.cc +18 -13
  73. data/src/core/ext/filters/client_channel/service_config.h +8 -5
  74. data/src/core/ext/filters/client_channel/service_config_call_data.h +19 -1
  75. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -2
  76. data/src/core/ext/filters/client_channel/service_config_parser.cc +8 -6
  77. data/src/core/ext/filters/client_channel/service_config_parser.h +8 -5
  78. data/src/core/ext/filters/client_channel/subchannel.cc +51 -64
  79. data/src/core/ext/filters/client_channel/subchannel.h +14 -20
  80. data/src/core/ext/filters/client_channel/subchannel_interface.h +41 -5
  81. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +6 -2
  82. data/src/core/ext/filters/deadline/deadline_filter.cc +87 -79
  83. data/src/core/ext/filters/deadline/deadline_filter.h +7 -11
  84. data/src/core/ext/filters/http/client/http_client_filter.cc +1 -1
  85. data/src/core/ext/filters/http/client_authority_filter.cc +6 -6
  86. data/src/core/ext/filters/http/http_filters_plugin.cc +6 -3
  87. data/src/core/ext/filters/http/server/http_server_filter.cc +3 -3
  88. data/src/core/ext/filters/max_age/max_age_filter.cc +1 -1
  89. data/src/core/ext/filters/message_size/message_size_filter.cc +3 -2
  90. data/src/core/ext/filters/message_size/message_size_filter.h +2 -1
  91. data/src/core/ext/filters/workarounds/workaround_utils.cc +1 -1
  92. data/src/core/ext/transport/chttp2/client/authority.cc +3 -3
  93. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +1 -1
  94. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +20 -8
  95. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +21 -10
  96. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +26 -14
  97. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +185 -79
  98. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +12 -5
  99. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +7 -7
  100. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +28 -42
  101. data/src/core/ext/transport/chttp2/transport/flow_control.cc +10 -2
  102. data/src/core/ext/transport/chttp2/transport/flow_control.h +13 -3
  103. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
  104. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
  105. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +6 -6
  106. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +12 -8
  107. data/src/core/ext/transport/chttp2/transport/internal.h +5 -1
  108. data/src/core/ext/transport/chttp2/transport/parsing.cc +18 -3
  109. data/src/core/ext/transport/chttp2/transport/writing.cc +2 -3
  110. data/src/core/ext/transport/inproc/inproc_transport.cc +42 -8
  111. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +1 -0
  112. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +1 -1
  113. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -0
  114. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +52 -32
  115. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +199 -34
  116. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +13 -13
  117. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +44 -17
  118. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +177 -99
  119. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +642 -202
  120. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +3 -3
  121. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +13 -5
  122. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +22 -22
  123. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +47 -21
  124. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +36 -24
  125. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +133 -39
  126. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +4 -4
  127. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +15 -6
  128. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +45 -44
  129. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +200 -78
  130. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +31 -24
  131. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +107 -47
  132. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +1 -1
  133. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +7 -0
  134. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +53 -0
  135. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +149 -0
  136. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +74 -28
  137. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +248 -43
  138. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +39 -39
  139. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +157 -89
  140. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +4 -4
  141. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +17 -9
  142. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +63 -39
  143. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +254 -60
  144. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +1 -1
  145. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +7 -0
  146. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +2 -2
  147. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +9 -2
  148. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +36 -0
  149. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +92 -0
  150. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +13 -13
  151. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +59 -36
  152. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +16 -16
  153. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +61 -29
  154. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +26 -26
  155. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +101 -66
  156. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +2 -2
  157. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +11 -3
  158. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +46 -26
  159. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +179 -68
  160. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +39 -22
  161. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +149 -48
  162. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +2 -2
  163. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +13 -0
  164. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +21 -17
  165. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +96 -33
  166. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +7 -7
  167. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +38 -22
  168. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +321 -194
  169. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +1228 -443
  170. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +8 -7
  171. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +34 -10
  172. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +3 -3
  173. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +17 -3
  174. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +132 -80
  175. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +516 -166
  176. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +1 -0
  177. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +24 -25
  178. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +96 -71
  179. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +12 -8
  180. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +46 -8
  181. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +71 -29
  182. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +296 -63
  183. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +1 -1
  184. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +7 -0
  185. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
  186. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +7 -0
  187. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +41 -31
  188. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +165 -64
  189. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +1 -1
  190. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +7 -0
  191. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +1 -1
  192. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +7 -0
  193. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +7 -7
  194. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +31 -16
  195. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +1 -1
  196. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +7 -0
  197. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +1 -1
  198. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +7 -0
  199. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +5 -5
  200. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +25 -11
  201. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +1 -1
  202. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +7 -0
  203. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +1 -1
  204. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +7 -0
  205. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +6 -6
  206. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +29 -8
  207. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +4 -3
  208. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +22 -3
  209. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +3 -3
  210. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +19 -0
  211. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +7 -7
  212. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +46 -3
  213. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +8 -8
  214. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +41 -8
  215. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +1 -0
  216. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +3 -3
  217. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +15 -2
  218. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +3 -3
  219. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +19 -0
  220. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +1 -1
  221. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +7 -0
  222. data/src/core/ext/upb-generated/google/api/annotations.upb.h +1 -0
  223. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +242 -0
  224. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +830 -0
  225. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +34 -34
  226. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +142 -59
  227. data/src/core/ext/upb-generated/google/api/http.upb.c +3 -3
  228. data/src/core/ext/upb-generated/google/api/http.upb.h +25 -6
  229. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +1 -1
  230. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +7 -0
  231. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +90 -90
  232. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +455 -292
  233. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +1 -1
  234. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +7 -0
  235. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
  236. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +7 -0
  237. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +4 -4
  238. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +22 -3
  239. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +1 -1
  240. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +7 -0
  241. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +9 -9
  242. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +55 -0
  243. data/src/core/ext/upb-generated/google/rpc/status.upb.c +1 -1
  244. data/src/core/ext/upb-generated/google/rpc/status.upb.h +10 -3
  245. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +4 -4
  246. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +11 -3
  247. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +41 -41
  248. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +149 -76
  249. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +5 -5
  250. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +21 -6
  251. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +2 -2
  252. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +13 -0
  253. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +17 -17
  254. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +82 -25
  255. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +3 -3
  256. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +19 -0
  257. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +31 -0
  258. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +64 -0
  259. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +1 -0
  260. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +2 -2
  261. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +9 -2
  262. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +1 -1
  263. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -0
  264. data/src/core/ext/upb-generated/udpa/core/v1/authority.upb.c +28 -0
  265. data/src/core/ext/upb-generated/udpa/core/v1/authority.upb.h +60 -0
  266. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c +52 -0
  267. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h +143 -0
  268. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c +42 -0
  269. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h +84 -0
  270. data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.c +36 -0
  271. data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.h +94 -0
  272. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c +54 -0
  273. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h +173 -0
  274. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c +36 -0
  275. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h +92 -0
  276. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +3 -3
  277. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +7 -0
  278. data/src/core/ext/upb-generated/validate/validate.upb.c +64 -64
  279. data/src/core/ext/upb-generated/validate/validate.upb.h +296 -157
  280. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +38 -0
  281. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h +30 -0
  282. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +41 -0
  283. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h +35 -0
  284. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +254 -0
  285. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h +105 -0
  286. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +100 -0
  287. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h +45 -0
  288. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +558 -0
  289. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +145 -0
  290. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +53 -0
  291. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h +35 -0
  292. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +133 -0
  293. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h +35 -0
  294. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +127 -0
  295. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h +65 -0
  296. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +56 -0
  297. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h +35 -0
  298. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +266 -0
  299. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +125 -0
  300. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +143 -0
  301. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +55 -0
  302. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +56 -0
  303. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h +35 -0
  304. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +66 -0
  305. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +40 -0
  306. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +263 -0
  307. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h +100 -0
  308. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +233 -0
  309. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +70 -0
  310. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +56 -0
  311. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h +35 -0
  312. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +228 -0
  313. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +80 -0
  314. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +46 -0
  315. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h +35 -0
  316. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +59 -0
  317. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h +35 -0
  318. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +55 -0
  319. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h +35 -0
  320. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +110 -0
  321. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h +50 -0
  322. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +113 -0
  323. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +50 -0
  324. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +146 -0
  325. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h +55 -0
  326. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +50 -0
  327. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h +35 -0
  328. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +190 -0
  329. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +55 -0
  330. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +185 -0
  331. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h +65 -0
  332. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +62 -0
  333. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h +40 -0
  334. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +97 -0
  335. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +40 -0
  336. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +915 -0
  337. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +280 -0
  338. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +71 -0
  339. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h +45 -0
  340. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +64 -0
  341. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h +40 -0
  342. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +511 -0
  343. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +115 -0
  344. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +48 -0
  345. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h +30 -0
  346. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +166 -0
  347. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h +55 -0
  348. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +105 -0
  349. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h +45 -0
  350. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +249 -0
  351. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +60 -0
  352. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +72 -0
  353. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h +35 -0
  354. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +60 -0
  355. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h +35 -0
  356. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +152 -0
  357. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +60 -0
  358. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +83 -0
  359. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h +35 -0
  360. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +82 -0
  361. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h +35 -0
  362. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +83 -0
  363. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h +40 -0
  364. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +86 -0
  365. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h +35 -0
  366. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +74 -0
  367. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h +35 -0
  368. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +64 -0
  369. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h +40 -0
  370. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +54 -0
  371. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h +35 -0
  372. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +53 -0
  373. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h +35 -0
  374. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +73 -0
  375. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h +45 -0
  376. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +72 -0
  377. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h +40 -0
  378. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +81 -0
  379. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h +45 -0
  380. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +92 -0
  381. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h +65 -0
  382. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +95 -0
  383. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h +55 -0
  384. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +34 -0
  385. data/src/core/ext/{upb-generated/gogoproto/gogo.upb.h → upbdefs-generated/envoy/type/v3/http.upbdefs.h} +10 -9
  386. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +59 -0
  387. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h +40 -0
  388. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +54 -0
  389. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h +45 -0
  390. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +47 -0
  391. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h +35 -0
  392. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +40 -0
  393. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h +30 -0
  394. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +61 -0
  395. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.h +45 -0
  396. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +39 -0
  397. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h +35 -0
  398. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +386 -0
  399. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h +165 -0
  400. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +40 -0
  401. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h +35 -0
  402. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +37 -0
  403. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h +35 -0
  404. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +65 -0
  405. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h +50 -0
  406. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +40 -0
  407. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h +35 -0
  408. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +66 -0
  409. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h +75 -0
  410. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +42 -0
  411. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h +35 -0
  412. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +70 -0
  413. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h +45 -0
  414. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +56 -0
  415. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h +35 -0
  416. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +33 -0
  417. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h +30 -0
  418. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +49 -0
  419. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h +35 -0
  420. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +43 -0
  421. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h +35 -0
  422. data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c +42 -0
  423. data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h +35 -0
  424. data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c +62 -0
  425. data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h +40 -0
  426. data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c +45 -0
  427. data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h +40 -0
  428. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c +49 -0
  429. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h +35 -0
  430. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c +68 -0
  431. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h +40 -0
  432. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c +51 -0
  433. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h +35 -0
  434. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +307 -0
  435. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.h +145 -0
  436. data/src/core/ext/xds/certificate_provider_factory.h +61 -0
  437. data/src/core/ext/xds/certificate_provider_registry.cc +103 -0
  438. data/src/core/ext/xds/certificate_provider_registry.h +57 -0
  439. data/src/core/ext/xds/certificate_provider_store.cc +87 -0
  440. data/src/core/ext/xds/certificate_provider_store.h +112 -0
  441. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +144 -0
  442. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +69 -0
  443. data/src/core/ext/xds/xds_api.cc +687 -767
  444. data/src/core/ext/xds/xds_api.h +207 -98
  445. data/src/core/ext/xds/xds_bootstrap.cc +172 -25
  446. data/src/core/ext/xds/xds_bootstrap.h +23 -8
  447. data/src/core/ext/xds/xds_certificate_provider.cc +299 -0
  448. data/src/core/ext/xds/xds_certificate_provider.h +112 -0
  449. data/src/core/ext/xds/xds_channel_args.h +6 -3
  450. data/src/core/ext/xds/xds_client.cc +617 -494
  451. data/src/core/ext/xds/xds_client.h +118 -58
  452. data/src/core/ext/xds/xds_client_stats.cc +59 -16
  453. data/src/core/ext/xds/xds_client_stats.h +35 -7
  454. data/src/core/ext/xds/xds_server_config_fetcher.cc +131 -0
  455. data/src/core/lib/channel/channel_args.cc +9 -8
  456. data/src/core/lib/channel/channel_args.h +0 -1
  457. data/src/core/lib/channel/channel_trace.cc +4 -2
  458. data/src/core/lib/channel/channel_trace.h +1 -1
  459. data/src/core/lib/channel/channelz.cc +23 -59
  460. data/src/core/lib/channel/channelz.h +13 -22
  461. data/src/core/lib/channel/channelz_registry.cc +12 -11
  462. data/src/core/lib/channel/channelz_registry.h +3 -1
  463. data/src/core/lib/channel/handshaker.cc +2 -2
  464. data/src/core/lib/channel/handshaker.h +2 -2
  465. data/src/core/lib/compression/compression.cc +8 -4
  466. data/src/core/lib/compression/compression_args.cc +3 -2
  467. data/src/core/lib/compression/compression_internal.cc +10 -5
  468. data/src/core/lib/compression/compression_internal.h +2 -1
  469. data/src/core/lib/compression/stream_compression_identity.cc +1 -3
  470. data/src/core/lib/debug/stats.h +2 -2
  471. data/src/core/lib/debug/stats_data.cc +1 -0
  472. data/src/core/lib/debug/stats_data.h +13 -13
  473. data/src/core/lib/gpr/alloc.cc +3 -2
  474. data/src/core/lib/gpr/cpu_iphone.cc +10 -2
  475. data/src/core/lib/gpr/log.cc +53 -16
  476. data/src/core/lib/gpr/log_linux.cc +19 -3
  477. data/src/core/lib/gpr/log_posix.cc +15 -1
  478. data/src/core/lib/gpr/log_windows.cc +18 -4
  479. data/src/core/lib/gpr/murmur_hash.cc +1 -1
  480. data/src/core/lib/gpr/spinlock.h +10 -2
  481. data/src/core/lib/gpr/string.cc +23 -22
  482. data/src/core/lib/gpr/string.h +5 -6
  483. data/src/core/lib/gpr/sync.cc +4 -4
  484. data/src/core/lib/gpr/time.cc +12 -12
  485. data/src/core/lib/gpr/time_precise.cc +5 -2
  486. data/src/core/lib/gpr/time_precise.h +6 -2
  487. data/src/core/lib/gpr/tls.h +4 -0
  488. data/src/core/lib/gpr/tls_msvc.h +2 -0
  489. data/src/core/lib/gpr/tls_stdcpp.h +48 -0
  490. data/src/core/lib/gpr/useful.h +5 -4
  491. data/src/core/lib/gprpp/arena.h +3 -2
  492. data/src/core/lib/gprpp/dual_ref_counted.h +331 -0
  493. data/src/core/lib/gprpp/examine_stack.cc +43 -0
  494. data/src/core/lib/gprpp/examine_stack.h +46 -0
  495. data/src/core/lib/gprpp/fork.cc +2 -2
  496. data/src/core/lib/gprpp/manual_constructor.h +1 -1
  497. data/src/core/lib/gprpp/orphanable.h +4 -8
  498. data/src/core/lib/gprpp/ref_counted.h +91 -68
  499. data/src/core/lib/gprpp/ref_counted_ptr.h +166 -7
  500. data/src/core/lib/{security/authorization/mock_cel/statusor.h → gprpp/stat.h} +13 -25
  501. data/src/core/lib/gprpp/stat_posix.cc +49 -0
  502. data/src/core/lib/gprpp/stat_windows.cc +48 -0
  503. data/src/core/lib/gprpp/thd.h +2 -2
  504. data/src/core/lib/gprpp/thd_posix.cc +42 -37
  505. data/src/core/lib/gprpp/thd_windows.cc +3 -1
  506. data/src/core/lib/http/httpcli.cc +1 -1
  507. data/src/core/lib/http/httpcli.h +2 -3
  508. data/src/core/lib/http/httpcli_security_connector.cc +1 -1
  509. data/src/core/lib/http/parser.cc +47 -27
  510. data/src/core/lib/iomgr/call_combiner.cc +8 -5
  511. data/src/core/lib/iomgr/combiner.cc +2 -1
  512. data/src/core/lib/iomgr/endpoint.h +1 -1
  513. data/src/core/lib/iomgr/endpoint_cfstream.cc +9 -5
  514. data/src/core/lib/iomgr/error.cc +17 -12
  515. data/src/core/lib/iomgr/error_internal.h +1 -1
  516. data/src/core/lib/iomgr/ev_epoll1_linux.cc +20 -13
  517. data/src/core/lib/iomgr/ev_epollex_linux.cc +25 -17
  518. data/src/core/lib/iomgr/ev_poll_posix.cc +9 -7
  519. data/src/core/lib/iomgr/exec_ctx.cc +1 -1
  520. data/src/core/lib/iomgr/exec_ctx.h +16 -12
  521. data/src/core/lib/iomgr/executor.cc +2 -1
  522. data/src/core/lib/iomgr/executor.h +1 -1
  523. data/src/core/lib/iomgr/executor/mpmcqueue.h +5 -5
  524. data/src/core/lib/iomgr/executor/threadpool.h +4 -4
  525. data/src/core/lib/iomgr/iomgr.cc +1 -1
  526. data/src/core/lib/iomgr/load_file.h +1 -1
  527. data/src/core/lib/iomgr/lockfree_event.cc +19 -14
  528. data/src/core/lib/iomgr/lockfree_event.h +2 -2
  529. data/src/core/lib/iomgr/parse_address.cc +127 -43
  530. data/src/core/lib/iomgr/parse_address.h +32 -8
  531. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +2 -1
  532. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +1 -1
  533. data/src/core/lib/iomgr/pollset_set_custom.cc +1 -1
  534. data/src/core/lib/iomgr/python_util.h +4 -4
  535. data/src/core/lib/iomgr/resolve_address.cc +4 -4
  536. data/src/core/lib/iomgr/resolve_address_posix.cc +1 -5
  537. data/src/core/lib/iomgr/resource_quota.cc +4 -4
  538. data/src/core/lib/iomgr/sockaddr_utils.cc +10 -10
  539. data/src/core/lib/iomgr/sockaddr_utils.h +1 -1
  540. data/src/core/lib/iomgr/socket_factory_posix.cc +3 -2
  541. data/src/core/lib/iomgr/socket_mutator.cc +3 -2
  542. data/src/core/lib/iomgr/tcp_client.cc +3 -3
  543. data/src/core/lib/iomgr/tcp_client_custom.cc +7 -6
  544. data/src/core/lib/iomgr/tcp_custom.cc +22 -17
  545. data/src/core/lib/iomgr/tcp_posix.cc +12 -8
  546. data/src/core/lib/iomgr/tcp_server_custom.cc +28 -22
  547. data/src/core/lib/iomgr/timer_custom.cc +5 -5
  548. data/src/core/lib/iomgr/timer_generic.cc +3 -3
  549. data/src/core/lib/iomgr/timer_manager.cc +2 -2
  550. data/src/core/lib/iomgr/udp_server.cc +1 -2
  551. data/src/core/lib/iomgr/udp_server.h +1 -2
  552. data/src/core/lib/iomgr/unix_sockets_posix.cc +32 -21
  553. data/src/core/lib/iomgr/unix_sockets_posix.h +5 -0
  554. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +7 -0
  555. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
  556. data/src/core/lib/json/json.h +12 -2
  557. data/src/core/lib/json/json_reader.cc +8 -4
  558. data/src/core/lib/json/json_util.cc +58 -0
  559. data/src/core/lib/json/json_util.h +204 -0
  560. data/src/core/lib/json/json_writer.cc +2 -1
  561. data/src/core/lib/security/authorization/evaluate_args.cc +5 -10
  562. data/src/core/lib/security/authorization/evaluate_args.h +1 -1
  563. data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +3 -1
  564. data/src/core/lib/security/authorization/mock_cel/cel_expression.h +5 -4
  565. data/src/core/lib/security/authorization/mock_cel/cel_value.h +4 -0
  566. data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +6 -6
  567. data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +10 -9
  568. data/src/core/lib/security/context/security_context.cc +4 -3
  569. data/src/core/lib/security/context/security_context.h +3 -1
  570. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +1 -1
  571. data/src/core/lib/security/credentials/credentials.cc +7 -7
  572. data/src/core/lib/security/credentials/credentials.h +3 -3
  573. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +413 -0
  574. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +80 -0
  575. data/src/core/lib/security/credentials/external/aws_request_signer.cc +213 -0
  576. data/src/core/lib/security/credentials/external/aws_request_signer.h +72 -0
  577. data/src/core/lib/security/credentials/external/external_account_credentials.cc +497 -0
  578. data/src/core/lib/security/credentials/external/external_account_credentials.h +120 -0
  579. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +135 -0
  580. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +48 -0
  581. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +213 -0
  582. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +58 -0
  583. data/src/core/lib/security/credentials/fake/fake_credentials.cc +2 -1
  584. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +18 -12
  585. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +64 -0
  586. data/src/core/lib/security/credentials/jwt/json_token.cc +6 -3
  587. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +4 -3
  588. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +8 -4
  589. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +39 -46
  590. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -4
  591. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +1 -1
  592. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +5 -5
  593. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +1 -1
  594. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +346 -0
  595. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +213 -0
  596. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +399 -0
  597. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +138 -0
  598. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +78 -150
  599. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +57 -187
  600. data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -12
  601. data/src/core/lib/security/credentials/tls/tls_credentials.h +2 -2
  602. data/src/core/lib/security/credentials/tls/tls_utils.cc +91 -0
  603. data/src/core/lib/security/credentials/tls/tls_utils.h +38 -0
  604. data/src/core/lib/security/credentials/xds/xds_credentials.cc +175 -0
  605. data/src/core/lib/security/credentials/xds/xds_credentials.h +69 -0
  606. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +1 -1
  607. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +9 -13
  608. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +121 -0
  609. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +87 -0
  610. data/src/core/lib/security/security_connector/load_system_roots.h +4 -0
  611. data/src/core/lib/security/security_connector/load_system_roots_linux.h +2 -0
  612. data/src/core/lib/security/security_connector/local/local_security_connector.cc +3 -3
  613. data/src/core/lib/security/security_connector/security_connector.cc +4 -3
  614. data/src/core/lib/security/security_connector/security_connector.h +4 -2
  615. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +4 -4
  616. data/src/core/lib/security/security_connector/ssl_utils.cc +2 -2
  617. data/src/core/lib/security/security_connector/ssl_utils.h +19 -19
  618. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +342 -279
  619. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +105 -61
  620. data/src/core/lib/security/transport/secure_endpoint.cc +2 -2
  621. data/src/core/lib/security/transport/security_handshaker.cc +3 -3
  622. data/src/core/lib/security/transport/server_auth_filter.cc +2 -1
  623. data/src/core/lib/security/util/json_util.h +1 -0
  624. data/src/core/lib/slice/slice.cc +7 -4
  625. data/src/core/lib/slice/slice_buffer.cc +2 -1
  626. data/src/core/lib/slice/slice_intern.cc +6 -7
  627. data/src/core/lib/slice/slice_internal.h +2 -2
  628. data/src/core/lib/surface/call.cc +41 -32
  629. data/src/core/lib/surface/call_details.cc +8 -8
  630. data/src/core/lib/surface/channel.cc +25 -41
  631. data/src/core/lib/surface/channel.h +9 -3
  632. data/src/core/lib/surface/channel_init.cc +1 -1
  633. data/src/core/lib/surface/completion_queue.cc +30 -24
  634. data/src/core/lib/surface/completion_queue.h +16 -16
  635. data/src/core/lib/surface/init.cc +32 -14
  636. data/src/core/lib/surface/lame_client.cc +20 -46
  637. data/src/core/lib/surface/lame_client.h +4 -0
  638. data/src/core/lib/surface/server.cc +63 -17
  639. data/src/core/lib/surface/server.h +39 -7
  640. data/src/core/lib/surface/validate_metadata.h +3 -0
  641. data/src/core/lib/surface/version.cc +2 -2
  642. data/src/core/lib/transport/authority_override.cc +6 -4
  643. data/src/core/lib/transport/authority_override.h +7 -2
  644. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  645. data/src/core/lib/transport/bdp_estimator.h +2 -1
  646. data/src/core/lib/transport/byte_stream.h +3 -3
  647. data/src/core/lib/transport/connectivity_state.h +11 -9
  648. data/src/core/lib/transport/error_utils.h +1 -1
  649. data/src/core/lib/transport/metadata.cc +11 -1
  650. data/src/core/lib/transport/metadata.h +2 -2
  651. data/src/core/lib/transport/metadata_batch.h +4 -4
  652. data/src/core/lib/transport/static_metadata.cc +1 -1
  653. data/src/core/lib/transport/status_metadata.cc +4 -3
  654. data/src/core/lib/transport/timeout_encoding.cc +4 -4
  655. data/src/core/lib/transport/transport.cc +5 -3
  656. data/src/core/lib/transport/transport.h +8 -8
  657. data/src/core/lib/uri/uri_parser.cc +131 -249
  658. data/src/core/lib/uri/uri_parser.h +57 -21
  659. data/src/core/plugin_registry/grpc_plugin_registry.cc +41 -20
  660. data/src/core/tsi/alts/crypt/gsec.cc +5 -4
  661. data/src/core/tsi/alts/frame_protector/frame_handler.cc +8 -6
  662. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  663. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +27 -26
  664. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +8 -6
  665. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +4 -4
  666. data/src/core/tsi/fake_transport_security.cc +6 -3
  667. data/src/core/tsi/local_transport_security.cc +5 -1
  668. data/src/core/tsi/local_transport_security.h +6 -7
  669. data/src/core/tsi/ssl/session_cache/ssl_session.h +3 -0
  670. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
  671. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -1
  672. data/src/core/tsi/ssl_transport_security.cc +78 -58
  673. data/src/core/tsi/ssl_transport_security.h +9 -6
  674. data/src/core/tsi/transport_security.cc +10 -8
  675. data/src/core/tsi/transport_security_interface.h +1 -1
  676. data/src/ruby/ext/grpc/extconf.rb +1 -1
  677. data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
  678. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +36 -16
  679. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +70 -40
  680. data/src/ruby/lib/grpc/version.rb +1 -1
  681. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +28 -0
  682. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +18 -0
  683. data/src/ruby/spec/pb/codegen/package_option_spec.rb +2 -6
  684. data/third_party/abseil-cpp/absl/algorithm/container.h +59 -22
  685. data/third_party/abseil-cpp/absl/base/attributes.h +99 -38
  686. data/third_party/abseil-cpp/absl/base/call_once.h +1 -1
  687. data/third_party/abseil-cpp/absl/base/casts.h +9 -6
  688. data/third_party/abseil-cpp/absl/base/config.h +60 -17
  689. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +428 -335
  690. data/third_party/abseil-cpp/absl/base/internal/bits.h +17 -16
  691. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +5 -0
  692. data/third_party/abseil-cpp/absl/base/internal/dynamic_annotations.h +398 -0
  693. data/third_party/abseil-cpp/absl/base/internal/invoke.h +4 -4
  694. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +1 -1
  695. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +29 -1
  696. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +2 -2
  697. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +7 -5
  698. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +25 -38
  699. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +19 -25
  700. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +8 -0
  701. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +28 -5
  702. data/third_party/abseil-cpp/absl/base/internal/sysinfo.h +8 -0
  703. data/third_party/abseil-cpp/absl/base/internal/tsan_mutex_interface.h +3 -1
  704. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +2 -2
  705. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +3 -3
  706. data/third_party/abseil-cpp/absl/base/macros.h +36 -109
  707. data/third_party/abseil-cpp/absl/base/optimization.h +61 -1
  708. data/third_party/abseil-cpp/absl/base/options.h +31 -4
  709. data/third_party/abseil-cpp/absl/base/policy_checks.h +1 -1
  710. data/third_party/abseil-cpp/absl/base/thread_annotations.h +94 -39
  711. data/third_party/abseil-cpp/absl/container/fixed_array.h +42 -25
  712. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +606 -0
  713. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +2 -1
  714. data/third_party/abseil-cpp/absl/container/inlined_vector.h +33 -36
  715. data/third_party/abseil-cpp/absl/container/internal/common.h +6 -2
  716. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +33 -8
  717. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +49 -29
  718. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +15 -0
  719. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +24 -7
  720. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +2 -1
  721. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +35 -11
  722. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +10 -9
  723. data/third_party/abseil-cpp/absl/container/internal/layout.h +7 -5
  724. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +197 -0
  725. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +55 -34
  726. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +5 -4
  727. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +66 -16
  728. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +4 -0
  729. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +13 -4
  730. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +43 -24
  731. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +12 -3
  732. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +10 -2
  733. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +22 -1
  734. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +0 -21
  735. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +12 -1
  736. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +101 -0
  737. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +100 -20
  738. data/third_party/abseil-cpp/absl/functional/bind_front.h +184 -0
  739. data/third_party/abseil-cpp/absl/functional/function_ref.h +1 -1
  740. data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +95 -0
  741. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +2 -2
  742. data/third_party/abseil-cpp/absl/hash/hash.h +6 -5
  743. data/third_party/abseil-cpp/absl/hash/internal/hash.h +73 -65
  744. data/third_party/abseil-cpp/absl/memory/memory.h +4 -0
  745. data/third_party/abseil-cpp/absl/meta/type_traits.h +2 -8
  746. data/third_party/abseil-cpp/absl/numeric/int128.cc +13 -27
  747. data/third_party/abseil-cpp/absl/numeric/int128.h +16 -15
  748. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +51 -0
  749. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +399 -0
  750. data/third_party/abseil-cpp/absl/status/status.cc +4 -6
  751. data/third_party/abseil-cpp/absl/status/status.h +502 -113
  752. data/third_party/abseil-cpp/absl/status/status_payload_printer.cc +5 -10
  753. data/third_party/abseil-cpp/absl/status/statusor.cc +71 -0
  754. data/third_party/abseil-cpp/absl/status/statusor.h +760 -0
  755. data/third_party/abseil-cpp/absl/strings/charconv.cc +2 -2
  756. data/third_party/abseil-cpp/absl/strings/cord.cc +91 -112
  757. data/third_party/abseil-cpp/absl/strings/cord.h +360 -205
  758. data/third_party/abseil-cpp/absl/strings/escaping.cc +9 -9
  759. data/third_party/abseil-cpp/absl/strings/internal/char_map.h +1 -1
  760. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
  761. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h +2 -2
  762. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +2 -2
  763. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +45 -23
  764. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +222 -136
  765. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +136 -64
  766. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +1 -1
  767. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +14 -21
  768. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -14
  769. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +31 -7
  770. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +147 -135
  771. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +999 -87
  772. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +3 -3
  773. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +4 -12
  774. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +8 -6
  775. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +13 -11
  776. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +2 -2
  777. data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
  778. data/third_party/abseil-cpp/absl/strings/str_cat.h +1 -1
  779. data/third_party/abseil-cpp/absl/strings/str_format.h +289 -13
  780. data/third_party/abseil-cpp/absl/strings/str_split.cc +2 -2
  781. data/third_party/abseil-cpp/absl/strings/str_split.h +1 -0
  782. data/third_party/abseil-cpp/absl/strings/string_view.h +26 -19
  783. data/third_party/abseil-cpp/absl/strings/substitute.cc +5 -5
  784. data/third_party/abseil-cpp/absl/strings/substitute.h +32 -29
  785. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +3 -3
  786. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +3 -3
  787. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +28 -28
  788. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +4 -16
  789. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -1
  790. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +8 -0
  791. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -2
  792. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +75 -64
  793. data/third_party/abseil-cpp/absl/synchronization/mutex.h +15 -6
  794. data/third_party/abseil-cpp/absl/time/civil_time.cc +9 -9
  795. data/third_party/abseil-cpp/absl/time/clock.cc +3 -3
  796. data/third_party/abseil-cpp/absl/time/duration.cc +90 -59
  797. data/third_party/abseil-cpp/absl/time/format.cc +43 -36
  798. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +26 -16
  799. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +4 -2
  800. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +1 -1
  801. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +136 -29
  802. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +13 -21
  803. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +1 -1
  804. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +136 -129
  805. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +4 -5
  806. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +8 -7
  807. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +6 -6
  808. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -1
  809. data/third_party/abseil-cpp/absl/time/time.h +15 -16
  810. data/third_party/abseil-cpp/absl/types/internal/variant.h +4 -4
  811. data/third_party/abseil-cpp/absl/types/optional.h +9 -9
  812. data/third_party/abseil-cpp/absl/types/span.h +49 -36
  813. data/third_party/abseil-cpp/absl/utility/utility.h +2 -2
  814. data/third_party/address_sorting/include/address_sorting/address_sorting.h +2 -0
  815. data/third_party/boringssl-with-bazel/err_data.c +469 -463
  816. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +0 -6
  817. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +2 -0
  818. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +9 -43
  819. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c +55 -4
  820. data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +34 -0
  821. data/third_party/boringssl-with-bazel/src/crypto/evp/evp.c +4 -0
  822. data/third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c +6 -2
  823. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +173 -35
  824. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c +2 -0
  825. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +4 -0
  826. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +30 -10
  827. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +56 -22
  828. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +8 -2
  829. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +98 -11
  830. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +51 -6
  831. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +118 -49
  832. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +267 -95
  833. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +210 -34
  834. data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +766 -0
  835. data/third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c +3 -3
  836. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +6 -4
  837. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +3 -3
  838. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +1 -1
  839. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +7 -2
  840. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +21 -18
  841. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +1 -1
  842. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +24 -3
  843. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +3 -3
  844. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c +67 -67
  845. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +3 -3
  846. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +29 -35
  847. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +13 -2
  848. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +9 -8
  849. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +10 -10
  850. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +2 -2
  851. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +28 -40
  852. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +3 -1
  853. data/third_party/boringssl-with-bazel/src/crypto/x509v3/ext_dat.h +1 -4
  854. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +5 -3
  855. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +14 -14
  856. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +7 -3
  857. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +2 -2
  858. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c +1 -1
  859. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +1 -1
  860. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +55 -8
  861. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +1 -1
  862. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +24 -0
  863. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +7 -5
  864. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +0 -1
  865. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +6 -3
  866. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +4 -0
  867. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +6 -0
  868. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +1 -1
  869. data/third_party/boringssl-with-bazel/src/include/openssl/des.h +6 -0
  870. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +12 -0
  871. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +9 -0
  872. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +4 -1
  873. data/third_party/boringssl-with-bazel/src/include/openssl/opensslconf.h +3 -0
  874. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +202 -134
  875. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +64 -3
  876. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +4 -0
  877. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +42 -14
  878. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +188 -78
  879. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +482 -432
  880. data/third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc +18 -5
  881. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +35 -0
  882. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +18 -18
  883. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +2 -3
  884. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +1 -1
  885. data/third_party/boringssl-with-bazel/src/ssl/internal.h +45 -10
  886. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +42 -1
  887. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +8 -9
  888. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +67 -0
  889. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +11 -14
  890. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +216 -11
  891. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +1 -2
  892. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +57 -19
  893. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +135 -41
  894. data/third_party/upb/third_party/wyhash/wyhash.h +145 -0
  895. data/third_party/upb/upb/decode.c +248 -167
  896. data/third_party/upb/upb/decode.h +20 -1
  897. data/third_party/upb/upb/decode.int.h +163 -0
  898. data/third_party/upb/upb/decode_fast.c +1040 -0
  899. data/third_party/upb/upb/decode_fast.h +126 -0
  900. data/third_party/upb/upb/def.c +2178 -0
  901. data/third_party/upb/upb/def.h +315 -0
  902. data/third_party/upb/upb/def.hpp +439 -0
  903. data/third_party/upb/upb/encode.c +227 -169
  904. data/third_party/upb/upb/encode.h +27 -2
  905. data/third_party/upb/upb/json_decode.c +1443 -0
  906. data/third_party/upb/upb/json_decode.h +23 -0
  907. data/third_party/upb/upb/json_encode.c +713 -0
  908. data/third_party/upb/upb/json_encode.h +36 -0
  909. data/third_party/upb/upb/msg.c +167 -88
  910. data/third_party/upb/upb/msg.h +174 -34
  911. data/third_party/upb/upb/port_def.inc +74 -61
  912. data/third_party/upb/upb/port_undef.inc +3 -7
  913. data/third_party/upb/upb/reflection.c +408 -0
  914. data/third_party/upb/upb/reflection.h +168 -0
  915. data/third_party/upb/upb/table.c +34 -197
  916. data/third_party/upb/upb/table.int.h +14 -5
  917. data/third_party/upb/upb/text_encode.c +421 -0
  918. data/third_party/upb/upb/text_encode.h +38 -0
  919. data/third_party/upb/upb/upb.c +18 -41
  920. data/third_party/upb/upb/upb.h +36 -7
  921. data/third_party/upb/upb/upb.hpp +4 -4
  922. data/third_party/upb/upb/upb.int.h +29 -0
  923. metadata +288 -54
  924. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +0 -946
  925. data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +0 -537
  926. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +0 -1141
  927. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +0 -485
  928. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +0 -68
  929. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +0 -354
  930. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +0 -142
  931. data/src/core/ext/upb-generated/gogoproto/gogo.upb.c +0 -17
  932. data/src/core/ext/xds/xds_channel.h +0 -46
  933. data/src/core/ext/xds/xds_channel_secure.cc +0 -103
  934. data/src/core/lib/gprpp/map.h +0 -53
  935. data/third_party/abseil-cpp/absl/base/dynamic_annotations.cc +0 -129
  936. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pku.c +0 -110
  937. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_sxnet.c +0 -274
  938. data/third_party/upb/upb/port.c +0 -26
@@ -44,13 +44,13 @@ namespace grpc_core {
44
44
 
45
45
  class HealthCheckClient : public InternallyRefCounted<HealthCheckClient> {
46
46
  public:
47
- HealthCheckClient(const char* service_name,
47
+ HealthCheckClient(std::string service_name,
48
48
  RefCountedPtr<ConnectedSubchannel> connected_subchannel,
49
49
  grpc_pollset_set* interested_parties,
50
50
  RefCountedPtr<channelz::SubchannelNode> channelz_node,
51
51
  RefCountedPtr<ConnectivityStateWatcherInterface> watcher);
52
52
 
53
- ~HealthCheckClient();
53
+ ~HealthCheckClient() override;
54
54
 
55
55
  void Orphan() override;
56
56
 
@@ -60,7 +60,7 @@ class HealthCheckClient : public InternallyRefCounted<HealthCheckClient> {
60
60
  public:
61
61
  CallState(RefCountedPtr<HealthCheckClient> health_check_client,
62
62
  grpc_pollset_set* interested_parties_);
63
- ~CallState();
63
+ ~CallState() override;
64
64
 
65
65
  void Orphan() override;
66
66
 
@@ -150,7 +150,7 @@ class HealthCheckClient : public InternallyRefCounted<HealthCheckClient> {
150
150
  void SetHealthStatusLocked(grpc_connectivity_state state,
151
151
  const char* reason); // Requires holding mu_.
152
152
 
153
- const char* service_name_; // Do not own.
153
+ std::string service_name_;
154
154
  RefCountedPtr<ConnectedSubchannel> connected_subchannel_;
155
155
  grpc_pollset_set* interested_parties_; // Do not own.
156
156
  RefCountedPtr<channelz::SubchannelNode> channelz_node_;
@@ -54,7 +54,7 @@ class HttpConnectHandshaker : public Handshaker {
54
54
  const char* name() const override { return "http_connect"; }
55
55
 
56
56
  private:
57
- virtual ~HttpConnectHandshaker();
57
+ ~HttpConnectHandshaker() override;
58
58
  void CleanupArgsForFailureLocked();
59
59
  void HandshakeFailedLocked(grpc_error* error);
60
60
  static void OnWriteDone(void* arg, grpc_error* error);
@@ -332,7 +332,7 @@ void HttpConnectHandshaker::DoHandshake(grpc_tcp_server_acceptor* /*acceptor*/,
332
332
  grpc_httpcli_request request;
333
333
  request.host = server_name;
334
334
  request.ssl_host_override = nullptr;
335
- request.http.method = (char*)"CONNECT";
335
+ request.http.method = const_cast<char*>("CONNECT");
336
336
  request.http.path = server_name;
337
337
  request.http.version = GRPC_HTTP_HTTP10; // Set by OnReadDone
338
338
  request.http.hdrs = headers;
@@ -382,8 +382,7 @@ class HttpConnectHandshakerFactory : public HandshakerFactory {
382
382
  } // namespace grpc_core
383
383
 
384
384
  void grpc_http_connect_register_handshaker_factory() {
385
- using namespace grpc_core;
386
- HandshakerRegistry::RegisterHandshakerFactory(
387
- true /* at_start */, HANDSHAKER_CLIENT,
388
- absl::make_unique<HttpConnectHandshakerFactory>());
385
+ grpc_core::HandshakerRegistry::RegisterHandshakerFactory(
386
+ true /* at_start */, grpc_core::HANDSHAKER_CLIENT,
387
+ absl::make_unique<grpc_core::HttpConnectHandshakerFactory>());
389
388
  }
@@ -24,6 +24,7 @@
24
24
  #include <string.h>
25
25
 
26
26
  #include "absl/strings/str_cat.h"
27
+ #include "absl/strings/strip.h"
27
28
 
28
29
  #include <grpc/support/alloc.h>
29
30
  #include <grpc/support/log.h>
@@ -47,9 +48,10 @@ namespace {
47
48
  * credentials if present in the 'http_proxy' env var, otherwise leaves it
48
49
  * unchanged. It is caller's responsibility to gpr_free user_cred.
49
50
  */
51
+ // TODO(hork): change this to return std::string
50
52
  char* GetHttpProxyServer(const grpc_channel_args* args, char** user_cred) {
51
53
  GPR_ASSERT(user_cred != nullptr);
52
- grpc_uri* uri = nullptr;
54
+ absl::StatusOr<URI> uri;
53
55
  char* proxy_name = nullptr;
54
56
  char** authority_strs = nullptr;
55
57
  size_t authority_nstrs;
@@ -69,17 +71,20 @@ char* GetHttpProxyServer(const grpc_channel_args* args, char** user_cred) {
69
71
  if (uri_str == nullptr) return nullptr;
70
72
  // an emtpy value means "don't use proxy"
71
73
  if (uri_str[0] == '\0') goto done;
72
- uri = grpc_uri_parse(uri_str, false /* suppress_errors */);
73
- if (uri == nullptr || uri->authority == nullptr) {
74
- gpr_log(GPR_ERROR, "cannot parse value of 'http_proxy' env var");
74
+ uri = URI::Parse(uri_str);
75
+ if (!uri.ok() || uri->authority().empty()) {
76
+ gpr_log(GPR_ERROR, "cannot parse value of 'http_proxy' env var. Error: %s",
77
+ uri.status().ToString().c_str());
75
78
  goto done;
76
79
  }
77
- if (strcmp(uri->scheme, "http") != 0) {
78
- gpr_log(GPR_ERROR, "'%s' scheme not supported in proxy URI", uri->scheme);
80
+ if (uri->scheme() != "http") {
81
+ gpr_log(GPR_ERROR, "'%s' scheme not supported in proxy URI",
82
+ uri->scheme().c_str());
79
83
  goto done;
80
84
  }
81
85
  /* Split on '@' to separate user credentials from host */
82
- gpr_string_split(uri->authority, "@", &authority_strs, &authority_nstrs);
86
+ gpr_string_split(uri->authority().c_str(), "@", &authority_strs,
87
+ &authority_nstrs);
83
88
  GPR_ASSERT(authority_nstrs != 0); /* should have at least 1 string */
84
89
  if (authority_nstrs == 1) {
85
90
  /* User cred not present in authority */
@@ -99,7 +104,6 @@ char* GetHttpProxyServer(const grpc_channel_args* args, char** user_cred) {
99
104
  gpr_free(authority_strs);
100
105
  done:
101
106
  gpr_free(uri_str);
102
- grpc_uri_destroy(uri);
103
107
  return proxy_name;
104
108
  }
105
109
 
@@ -114,15 +118,15 @@ class HttpProxyMapper : public ProxyMapperInterface {
114
118
  *name_to_resolve = GetHttpProxyServer(args, &user_cred);
115
119
  if (*name_to_resolve == nullptr) return false;
116
120
  char* no_proxy_str = nullptr;
117
- grpc_uri* uri = grpc_uri_parse(server_uri, false /* suppress_errors */);
118
- if (uri == nullptr || uri->path[0] == '\0') {
121
+ absl::StatusOr<URI> uri = URI::Parse(server_uri);
122
+ if (!uri.ok() || uri->path().empty()) {
119
123
  gpr_log(GPR_ERROR,
120
124
  "'http_proxy' environment variable set, but cannot "
121
- "parse server URI '%s' -- not using proxy",
122
- server_uri);
125
+ "parse server URI '%s' -- not using proxy. Error: %s",
126
+ server_uri, uri.status().ToString().c_str());
123
127
  goto no_use_proxy;
124
128
  }
125
- if (strcmp(uri->scheme, "unix") == 0) {
129
+ if (uri->scheme() == "unix") {
126
130
  gpr_log(GPR_INFO, "not using proxy for Unix domain socket '%s'",
127
131
  server_uri);
128
132
  goto no_use_proxy;
@@ -135,9 +139,8 @@ class HttpProxyMapper : public ProxyMapperInterface {
135
139
  bool use_proxy = true;
136
140
  std::string server_host;
137
141
  std::string server_port;
138
- if (!grpc_core::SplitHostPort(
139
- uri->path[0] == '/' ? uri->path + 1 : uri->path, &server_host,
140
- &server_port)) {
142
+ if (!SplitHostPort(absl::StripPrefix(uri->path(), "/"), &server_host,
143
+ &server_port)) {
141
144
  gpr_log(GPR_INFO,
142
145
  "unable to split host and port, not checking no_proxy list for "
143
146
  "host '%s'",
@@ -172,8 +175,8 @@ class HttpProxyMapper : public ProxyMapperInterface {
172
175
  }
173
176
  grpc_arg args_to_add[2];
174
177
  args_to_add[0] = grpc_channel_arg_string_create(
175
- (char*)GRPC_ARG_HTTP_CONNECT_SERVER,
176
- uri->path[0] == '/' ? uri->path + 1 : uri->path);
178
+ const_cast<char*>(GRPC_ARG_HTTP_CONNECT_SERVER),
179
+ const_cast<char*>(absl::StripPrefix(uri->path(), "/").data()));
177
180
  if (user_cred != nullptr) {
178
181
  /* Use base64 encoding for user credentials as stated in RFC 7617 */
179
182
  char* encoded_user_cred =
@@ -188,11 +191,9 @@ class HttpProxyMapper : public ProxyMapperInterface {
188
191
  } else {
189
192
  *new_args = grpc_channel_args_copy_and_add(args, args_to_add, 1);
190
193
  }
191
- grpc_uri_destroy(uri);
192
194
  gpr_free(user_cred);
193
195
  return true;
194
196
  no_use_proxy:
195
- if (uri != nullptr) grpc_uri_destroy(uri);
196
197
  gpr_free(*name_to_resolve);
197
198
  *name_to_resolve = nullptr;
198
199
  gpr_free(user_cred);
@@ -32,7 +32,11 @@ DebugOnlyTraceFlag grpc_trace_lb_policy_refcount(false, "lb_policy_refcount");
32
32
  //
33
33
 
34
34
  LoadBalancingPolicy::LoadBalancingPolicy(Args args, intptr_t initial_refcount)
35
- : InternallyRefCounted(&grpc_trace_lb_policy_refcount, initial_refcount),
35
+ : InternallyRefCounted(
36
+ GRPC_TRACE_FLAG_ENABLED(grpc_trace_lb_policy_refcount)
37
+ ? "LoadBalancingPolicy"
38
+ : nullptr,
39
+ initial_refcount),
36
40
  work_serializer_(std::move(args.work_serializer)),
37
41
  interested_parties_(grpc_pollset_set_create()),
38
42
  channel_control_helper_(std::move(args.channel_control_helper)) {}
@@ -101,7 +105,7 @@ LoadBalancingPolicy::PickResult LoadBalancingPolicy::QueuePicker::Pick(
101
105
  // 2. We are currently running in the data plane mutex, but we
102
106
  // need to bounce into the control plane work_serializer to call
103
107
  // ExitIdleLocked().
104
- if (!exit_idle_called_) {
108
+ if (!exit_idle_called_ && parent_ != nullptr) {
105
109
  exit_idle_called_ = true;
106
110
  auto* parent = parent_->Ref().release(); // ref held by lambda.
107
111
  ExecCtx::Run(DEBUG_LOCATION,
@@ -30,7 +30,6 @@
30
30
  #include "src/core/ext/filters/client_channel/server_address.h"
31
31
  #include "src/core/ext/filters/client_channel/service_config.h"
32
32
  #include "src/core/ext/filters/client_channel/subchannel_interface.h"
33
- #include "src/core/lib/gprpp/map.h"
34
33
  #include "src/core/lib/gprpp/orphanable.h"
35
34
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
36
35
  #include "src/core/lib/iomgr/polling_entity.h"
@@ -95,11 +94,11 @@ class LoadBalancingPolicy : public InternallyRefCounted<LoadBalancingPolicy> {
95
94
  /// Application-specific requests cost metrics. Metric names are
96
95
  /// determined by the application. Each value is an absolute cost
97
96
  /// (e.g. 3487 bytes of storage) associated with the request.
98
- std::map<absl::string_view, double, StringLess> request_cost;
97
+ std::map<absl::string_view, double> request_cost;
99
98
  /// Application-specific resource utilization metrics. Metric names
100
99
  /// are determined by the application. Each value is expressed as a
101
100
  /// fraction of total resources available.
102
- std::map<absl::string_view, double, StringLess> utilization;
101
+ std::map<absl::string_view, double> utilization;
103
102
  };
104
103
 
105
104
  /// Interface for accessing per-call state.
@@ -279,7 +278,7 @@ class LoadBalancingPolicy : public InternallyRefCounted<LoadBalancingPolicy> {
279
278
 
280
279
  /// Creates a new subchannel with the specified channel args.
281
280
  virtual RefCountedPtr<SubchannelInterface> CreateSubchannel(
282
- const grpc_channel_args& args) = 0;
281
+ ServerAddress address, const grpc_channel_args& args) = 0;
283
282
 
284
283
  /// Sets the connectivity state and returns a new picker to be used
285
284
  /// by the client channel.
@@ -301,7 +300,7 @@ class LoadBalancingPolicy : public InternallyRefCounted<LoadBalancingPolicy> {
301
300
  /// return the parameters they need.
302
301
  class Config : public RefCounted<Config> {
303
302
  public:
304
- virtual ~Config() = default;
303
+ ~Config() override = default;
305
304
 
306
305
  // Returns the load balancing policy name
307
306
  virtual const char* name() const = 0;
@@ -341,7 +340,7 @@ class LoadBalancingPolicy : public InternallyRefCounted<LoadBalancingPolicy> {
341
340
  };
342
341
 
343
342
  explicit LoadBalancingPolicy(Args args, intptr_t initial_refcount = 1);
344
- virtual ~LoadBalancingPolicy();
343
+ ~LoadBalancingPolicy() override;
345
344
 
346
345
  // Not copyable nor movable.
347
346
  LoadBalancingPolicy(const LoadBalancingPolicy&) = delete;
@@ -376,7 +375,7 @@ class LoadBalancingPolicy : public InternallyRefCounted<LoadBalancingPolicy> {
376
375
  explicit QueuePicker(RefCountedPtr<LoadBalancingPolicy> parent)
377
376
  : parent_(std::move(parent)) {}
378
377
 
379
- ~QueuePicker() { parent_.reset(DEBUG_LOCATION, "QueuePicker"); }
378
+ ~QueuePicker() override { parent_.reset(DEBUG_LOCATION, "QueuePicker"); }
380
379
 
381
380
  PickResult Pick(PickArgs args) override;
382
381
 
@@ -18,64 +18,77 @@
18
18
 
19
19
  #include "src/core/ext/filters/client_channel/lb_policy/address_filtering.h"
20
20
 
21
+ #include "absl/strings/str_cat.h"
22
+ #include "absl/strings/str_join.h"
23
+
21
24
  #include "src/core/lib/channel/channel_args.h"
22
25
 
23
26
  #define GRPC_ARG_HIERARCHICAL_PATH "grpc.internal.address.hierarchical_path"
24
27
 
25
28
  namespace grpc_core {
26
29
 
30
+ const char* kHierarchicalPathAttributeKey = "hierarchical_path";
31
+
27
32
  namespace {
28
33
 
29
- void* HierarchicalPathCopy(void* p) {
30
- std::vector<std::string>* path = static_cast<std::vector<std::string>*>(p);
31
- return static_cast<void*>(new std::vector<std::string>(*path));
32
- }
34
+ class HierarchicalPathAttribute : public ServerAddress::AttributeInterface {
35
+ public:
36
+ explicit HierarchicalPathAttribute(std::vector<std::string> path)
37
+ : path_(std::move(path)) {}
33
38
 
34
- void HierarchicalPathDestroy(void* p) {
35
- std::vector<std::string>* path = static_cast<std::vector<std::string>*>(p);
36
- delete path;
37
- }
39
+ std::unique_ptr<AttributeInterface> Copy() const override {
40
+ return absl::make_unique<HierarchicalPathAttribute>(path_);
41
+ }
38
42
 
39
- int HierarchicalPathCompare(void* p1, void* p2) {
40
- std::vector<std::string>* path1 = static_cast<std::vector<std::string>*>(p1);
41
- std::vector<std::string>* path2 = static_cast<std::vector<std::string>*>(p2);
42
- for (size_t i = 0; i < path1->size(); ++i) {
43
- if (path2->size() == i) return 1;
44
- int r = (*path1)[i].compare((*path2)[i]);
45
- if (r != 0) return r;
43
+ int Cmp(const AttributeInterface* other) const override {
44
+ const std::vector<std::string>& other_path =
45
+ static_cast<const HierarchicalPathAttribute*>(other)->path_;
46
+ for (size_t i = 0; i < path_.size(); ++i) {
47
+ if (other_path.size() == i) return 1;
48
+ int r = path_[i].compare(other_path[i]);
49
+ if (r != 0) return r;
50
+ }
51
+ if (other_path.size() > path_.size()) return -1;
52
+ return 0;
46
53
  }
47
- if (path2->size() > path1->size()) return -1;
48
- return 0;
49
- }
50
54
 
51
- const grpc_arg_pointer_vtable hierarchical_path_arg_vtable = {
52
- HierarchicalPathCopy, HierarchicalPathDestroy, HierarchicalPathCompare};
55
+ std::string ToString() const override {
56
+ return absl::StrCat("[", absl::StrJoin(path_, ", "), "]");
57
+ }
58
+
59
+ const std::vector<std::string>& path() const { return path_; }
60
+
61
+ private:
62
+ std::vector<std::string> path_;
63
+ };
53
64
 
54
65
  } // namespace
55
66
 
56
- grpc_arg MakeHierarchicalPathArg(const std::vector<std::string>& path) {
57
- return grpc_channel_arg_pointer_create(
58
- const_cast<char*>(GRPC_ARG_HIERARCHICAL_PATH),
59
- const_cast<std::vector<std::string>*>(&path),
60
- &hierarchical_path_arg_vtable);
67
+ std::unique_ptr<ServerAddress::AttributeInterface>
68
+ MakeHierarchicalPathAttribute(std::vector<std::string> path) {
69
+ return absl::make_unique<HierarchicalPathAttribute>(std::move(path));
61
70
  }
62
71
 
63
72
  HierarchicalAddressMap MakeHierarchicalAddressMap(
64
73
  const ServerAddressList& addresses) {
65
74
  HierarchicalAddressMap result;
66
75
  for (const ServerAddress& address : addresses) {
67
- auto* path = grpc_channel_args_find_pointer<std::vector<std::string>>(
68
- address.args(), GRPC_ARG_HIERARCHICAL_PATH);
69
- if (path == nullptr || path->empty()) continue;
70
- auto it = path->begin();
76
+ const HierarchicalPathAttribute* path_attribute =
77
+ static_cast<const HierarchicalPathAttribute*>(
78
+ address.GetAttribute(kHierarchicalPathAttributeKey));
79
+ if (path_attribute == nullptr) continue;
80
+ const std::vector<std::string>& path = path_attribute->path();
81
+ auto it = path.begin();
71
82
  ServerAddressList& target_list = result[*it];
83
+ std::unique_ptr<HierarchicalPathAttribute> new_attribute;
72
84
  ++it;
73
- std::vector<std::string> remaining_path(it, path->end());
74
- const char* name_to_remove = GRPC_ARG_HIERARCHICAL_PATH;
75
- grpc_arg new_arg = MakeHierarchicalPathArg(remaining_path);
76
- grpc_channel_args* new_args = grpc_channel_args_copy_and_add_and_remove(
77
- address.args(), &name_to_remove, 1, &new_arg, 1);
78
- target_list.emplace_back(address.address(), new_args);
85
+ if (it != path.end()) {
86
+ std::vector<std::string> remaining_path(it, path.end());
87
+ new_attribute = absl::make_unique<HierarchicalPathAttribute>(
88
+ std::move(remaining_path));
89
+ }
90
+ target_list.emplace_back(address.WithAttribute(
91
+ kHierarchicalPathAttributeKey, std::move(new_attribute)));
79
92
  }
80
93
  return result;
81
94
  }
@@ -23,8 +23,6 @@
23
23
  #include <string>
24
24
  #include <vector>
25
25
 
26
- #include "absl/strings/string_view.h"
27
-
28
26
  #include "src/core/ext/filters/client_channel/server_address.h"
29
27
 
30
28
  // The resolver returns a flat list of addresses. When a hierarchy of
@@ -81,9 +79,13 @@
81
79
 
82
80
  namespace grpc_core {
83
81
 
84
- // Constructs a channel arg containing the hierarchical path
85
- // to be associated with an address.
86
- grpc_arg MakeHierarchicalPathArg(const std::vector<std::string>& path);
82
+ // The attribute key to be used for hierarchical paths in ServerAddress.
83
+ extern const char* kHierarchicalPathAttributeKey;
84
+
85
+ // Constructs an address attribute containing the hierarchical path
86
+ // to be associated with the address.
87
+ std::unique_ptr<ServerAddress::AttributeInterface>
88
+ MakeHierarchicalPathAttribute(std::vector<std::string> path);
87
89
 
88
90
  // A map from the next path element to the addresses that fall under
89
91
  // that path element.
@@ -36,13 +36,14 @@ class ChildPolicyHandler::Helper
36
36
  explicit Helper(RefCountedPtr<ChildPolicyHandler> parent)
37
37
  : parent_(std::move(parent)) {}
38
38
 
39
- ~Helper() { parent_.reset(DEBUG_LOCATION, "Helper"); }
39
+ ~Helper() override { parent_.reset(DEBUG_LOCATION, "Helper"); }
40
40
 
41
41
  RefCountedPtr<SubchannelInterface> CreateSubchannel(
42
- const grpc_channel_args& args) override {
42
+ ServerAddress address, const grpc_channel_args& args) override {
43
43
  if (parent_->shutting_down_) return nullptr;
44
44
  if (!CalledByCurrentChild() && !CalledByPendingChild()) return nullptr;
45
- return parent_->channel_control_helper()->CreateSubchannel(args);
45
+ return parent_->channel_control_helper()->CreateSubchannel(
46
+ std::move(address), args);
46
47
  }
47
48
 
48
49
  void UpdateState(grpc_connectivity_state state, const absl::Status& status,
@@ -36,7 +36,7 @@ class ChildPolicyHandler : public LoadBalancingPolicy {
36
36
  ChildPolicyHandler(Args args, TraceFlag* tracer)
37
37
  : LoadBalancingPolicy(std::move(args)), tracer_(tracer) {}
38
38
 
39
- virtual const char* name() const override { return "child_policy_handler"; }
39
+ const char* name() const override { return "child_policy_handler"; }
40
40
 
41
41
  void UpdateLocked(UpdateArgs args) override;
42
42
  void ExitIdleLocked() override;
@@ -68,6 +68,7 @@
68
68
  #include "absl/strings/str_cat.h"
69
69
  #include "absl/strings/str_format.h"
70
70
  #include "absl/strings/str_join.h"
71
+ #include "absl/strings/strip.h"
71
72
 
72
73
  #include "upb/upb.hpp"
73
74
 
@@ -124,6 +125,8 @@ TraceFlag grpc_lb_glb_trace(false, "glb");
124
125
  const char kGrpcLbClientStatsMetadataKey[] = "grpclb_client_stats";
125
126
  const char kGrpcLbLbTokenMetadataKey[] = "lb-token";
126
127
 
128
+ const char kGrpcLbAddressAttributeKey[] = "grpclb";
129
+
127
130
  namespace {
128
131
 
129
132
  constexpr char kGrpclb[] = "grpclb";
@@ -162,7 +165,7 @@ class GrpcLb : public LoadBalancingPolicy {
162
165
  public:
163
166
  explicit BalancerCallState(
164
167
  RefCountedPtr<LoadBalancingPolicy> parent_grpclb_policy);
165
- ~BalancerCallState();
168
+ ~BalancerCallState() override;
166
169
 
167
170
  // It's the caller's responsibility to ensure that Orphan() is called from
168
171
  // inside the combiner.
@@ -233,6 +236,59 @@ class GrpcLb : public LoadBalancingPolicy {
233
236
  grpc_closure client_load_report_closure_;
234
237
  };
235
238
 
239
+ class SubchannelWrapper : public DelegatingSubchannel {
240
+ public:
241
+ SubchannelWrapper(RefCountedPtr<SubchannelInterface> subchannel,
242
+ std::string lb_token,
243
+ RefCountedPtr<GrpcLbClientStats> client_stats)
244
+ : DelegatingSubchannel(std::move(subchannel)),
245
+ lb_token_(std::move(lb_token)),
246
+ client_stats_(std::move(client_stats)) {}
247
+
248
+ const std::string& lb_token() const { return lb_token_; }
249
+ GrpcLbClientStats* client_stats() const { return client_stats_.get(); }
250
+
251
+ private:
252
+ std::string lb_token_;
253
+ RefCountedPtr<GrpcLbClientStats> client_stats_;
254
+ };
255
+
256
+ class TokenAndClientStatsAttribute
257
+ : public ServerAddress::AttributeInterface {
258
+ public:
259
+ TokenAndClientStatsAttribute(std::string lb_token,
260
+ RefCountedPtr<GrpcLbClientStats> client_stats)
261
+ : lb_token_(std::move(lb_token)),
262
+ client_stats_(std::move(client_stats)) {}
263
+
264
+ std::unique_ptr<AttributeInterface> Copy() const override {
265
+ return absl::make_unique<TokenAndClientStatsAttribute>(lb_token_,
266
+ client_stats_);
267
+ }
268
+
269
+ int Cmp(const AttributeInterface* other_base) const override {
270
+ const TokenAndClientStatsAttribute* other =
271
+ static_cast<const TokenAndClientStatsAttribute*>(other_base);
272
+ int r = lb_token_.compare(other->lb_token_);
273
+ if (r != 0) return r;
274
+ return GPR_ICMP(client_stats_.get(), other->client_stats_.get());
275
+ }
276
+
277
+ std::string ToString() const override {
278
+ return absl::StrFormat("lb_token=\"%s\" client_stats=%p", lb_token_,
279
+ client_stats_.get());
280
+ }
281
+
282
+ const std::string& lb_token() const { return lb_token_; }
283
+ RefCountedPtr<GrpcLbClientStats> client_stats() const {
284
+ return client_stats_;
285
+ }
286
+
287
+ private:
288
+ std::string lb_token_;
289
+ RefCountedPtr<GrpcLbClientStats> client_stats_;
290
+ };
291
+
236
292
  class Serverlist : public RefCounted<Serverlist> {
237
293
  public:
238
294
  // Takes ownership of serverlist.
@@ -274,21 +330,16 @@ class GrpcLb : public LoadBalancingPolicy {
274
330
 
275
331
  class Picker : public SubchannelPicker {
276
332
  public:
277
- Picker(GrpcLb* parent, RefCountedPtr<Serverlist> serverlist,
333
+ Picker(RefCountedPtr<Serverlist> serverlist,
278
334
  std::unique_ptr<SubchannelPicker> child_picker,
279
335
  RefCountedPtr<GrpcLbClientStats> client_stats)
280
- : parent_(parent),
281
- serverlist_(std::move(serverlist)),
336
+ : serverlist_(std::move(serverlist)),
282
337
  child_picker_(std::move(child_picker)),
283
338
  client_stats_(std::move(client_stats)) {}
284
339
 
285
340
  PickResult Pick(PickArgs args) override;
286
341
 
287
342
  private:
288
- // Storing the address for logging, but not holding a ref.
289
- // DO NOT DEFERENCE!
290
- GrpcLb* parent_;
291
-
292
343
  // Serverlist to be used for determining drops.
293
344
  RefCountedPtr<Serverlist> serverlist_;
294
345
 
@@ -302,7 +353,7 @@ class GrpcLb : public LoadBalancingPolicy {
302
353
  : parent_(std::move(parent)) {}
303
354
 
304
355
  RefCountedPtr<SubchannelInterface> CreateSubchannel(
305
- const grpc_channel_args& args) override;
356
+ ServerAddress address, const grpc_channel_args& args) override;
306
357
  void UpdateState(grpc_connectivity_state state, const absl::Status& status,
307
358
  std::unique_ptr<SubchannelPicker> picker) override;
308
359
  void RequestReresolution() override;
@@ -319,7 +370,7 @@ class GrpcLb : public LoadBalancingPolicy {
319
370
  : AsyncConnectivityStateWatcherInterface(parent->work_serializer()),
320
371
  parent_(std::move(parent)) {}
321
372
 
322
- ~StateWatcher() { parent_.reset(DEBUG_LOCATION, "StateWatcher"); }
373
+ ~StateWatcher() override { parent_.reset(DEBUG_LOCATION, "StateWatcher"); }
323
374
 
324
375
  private:
325
376
  void OnConnectivityStateChange(grpc_connectivity_state new_state,
@@ -345,13 +396,15 @@ class GrpcLb : public LoadBalancingPolicy {
345
396
  RefCountedPtr<GrpcLb> parent_;
346
397
  };
347
398
 
348
- ~GrpcLb();
399
+ ~GrpcLb() override;
349
400
 
350
401
  void ShutdownLocked() override;
351
402
 
352
403
  // Helper functions used in UpdateLocked().
353
404
  void ProcessAddressesAndChannelArgsLocked(const ServerAddressList& addresses,
354
405
  const grpc_channel_args& args);
406
+ static ServerAddressList AddNullLbTokenToAddresses(
407
+ const ServerAddressList& addresses);
355
408
 
356
409
  void CancelBalancerChannelConnectivityWatchLocked();
357
410
 
@@ -374,7 +427,7 @@ class GrpcLb : public LoadBalancingPolicy {
374
427
  void CreateOrUpdateChildPolicyLocked();
375
428
 
376
429
  // Who the client is trying to communicate with.
377
- const char* server_name_ = nullptr;
430
+ std::string server_name_;
378
431
  // Configurations for the policy.
379
432
  RefCountedPtr<GrpcLbConfig> config_;
380
433
 
@@ -389,6 +442,8 @@ class GrpcLb : public LoadBalancingPolicy {
389
442
  StateWatcher* watcher_ = nullptr;
390
443
  // Response generator to inject address updates into lb_channel_.
391
444
  RefCountedPtr<FakeResolverResponseGenerator> response_generator_;
445
+ // Parent channelz node.
446
+ RefCountedPtr<channelz::ChannelNode> parent_channelz_node_;
392
447
 
393
448
  // The data associated with the current LB call. It holds a ref to this LB
394
449
  // policy. It's initialized every time we query for backends. It's reset to
@@ -437,7 +492,7 @@ bool GrpcLb::Serverlist::operator==(const Serverlist& other) const {
437
492
  void ParseServer(const GrpcLbServer& server, grpc_resolved_address* addr) {
438
493
  memset(addr, 0, sizeof(*addr));
439
494
  if (server.drop) return;
440
- const uint16_t netorder_port = grpc_htons((uint16_t)server.port);
495
+ const uint16_t netorder_port = grpc_htons(static_cast<uint16_t>(server.port));
441
496
  /* the addresses are given in binary format (a in(6)_addr struct) in
442
497
  * server->ip_address.bytes. */
443
498
  if (server.ip_size == 4) {
@@ -448,7 +503,8 @@ void ParseServer(const GrpcLbServer& server, grpc_resolved_address* addr) {
448
503
  addr4->sin_port = netorder_port;
449
504
  } else if (server.ip_size == 16) {
450
505
  addr->len = static_cast<socklen_t>(sizeof(grpc_sockaddr_in6));
451
- grpc_sockaddr_in6* addr6 = (grpc_sockaddr_in6*)&addr->addr;
506
+ grpc_sockaddr_in6* addr6 =
507
+ reinterpret_cast<grpc_sockaddr_in6*>(&addr->addr);
452
508
  addr6->sin6_family = GRPC_AF_INET6;
453
509
  memcpy(&addr6->sin6_addr, server.ip_addr, server.ip_size);
454
510
  addr6->sin6_port = netorder_port;
@@ -473,60 +529,23 @@ std::string GrpcLb::Serverlist::AsText() const {
473
529
  return absl::StrJoin(entries, "");
474
530
  }
475
531
 
476
- // vtables for channel args for LB token and client stats.
477
- void* lb_token_copy(void* token) {
478
- return gpr_strdup(static_cast<char*>(token));
479
- }
480
- void lb_token_destroy(void* token) { gpr_free(token); }
481
- void* client_stats_copy(void* p) {
482
- GrpcLbClientStats* client_stats = static_cast<GrpcLbClientStats*>(p);
483
- client_stats->Ref().release();
484
- return p;
485
- }
486
- void client_stats_destroy(void* p) {
487
- GrpcLbClientStats* client_stats = static_cast<GrpcLbClientStats*>(p);
488
- client_stats->Unref();
489
- }
490
- int equal_cmp(void* /*p1*/, void* /*p2*/) {
491
- // Always indicate a match, since we don't want this channel arg to
492
- // affect the subchannel's key in the index.
493
- // TODO(roth): Is this right? This does prevent us from needlessly
494
- // recreating the subchannel whenever the LB token or client stats
495
- // changes (i.e., when the balancer call is terminated and reestablished).
496
- // However, it means that we don't actually recreate the subchannel,
497
- // which means that we won't ever switch over to using the new LB
498
- // token or client stats. A better approach might be to find somewhere
499
- // other than the subchannel args to store the LB token and client
500
- // stats. They could be stored in a map and then looked up for each
501
- // call. Or we could do something more complicated whereby
502
- // we create our own subchannel wrapper to store them, although that would
503
- // involve a lot of refcounting overhead.
504
- // Given that we're trying to move from grpclb to xds at this point,
505
- // and that no one has actually reported any problems with this, we
506
- // probably won't bother fixing this at this point.
507
- return 0;
508
- }
509
- const grpc_arg_pointer_vtable lb_token_arg_vtable = {
510
- lb_token_copy, lb_token_destroy, equal_cmp};
511
- const grpc_arg_pointer_vtable client_stats_arg_vtable = {
512
- client_stats_copy, client_stats_destroy, equal_cmp};
513
-
514
532
  bool IsServerValid(const GrpcLbServer& server, size_t idx, bool log) {
515
533
  if (server.drop) return false;
516
534
  if (GPR_UNLIKELY(server.port >> 16 != 0)) {
517
535
  if (log) {
518
536
  gpr_log(GPR_ERROR,
519
- "Invalid port '%d' at index %lu of serverlist. Ignoring.",
520
- server.port, (unsigned long)idx);
537
+ "Invalid port '%d' at index %" PRIuPTR
538
+ " of serverlist. Ignoring.",
539
+ server.port, idx);
521
540
  }
522
541
  return false;
523
542
  }
524
543
  if (GPR_UNLIKELY(server.ip_size != 4 && server.ip_size != 16)) {
525
544
  if (log) {
526
545
  gpr_log(GPR_ERROR,
527
- "Expected IP to be 4 or 16 bytes, got %d at index %lu of "
528
- "serverlist. Ignoring",
529
- server.ip_size, (unsigned long)idx);
546
+ "Expected IP to be 4 or 16 bytes, got %d at index %" PRIuPTR
547
+ " of serverlist. Ignoring",
548
+ server.ip_size, idx);
530
549
  }
531
550
  return false;
532
551
  }
@@ -536,6 +555,8 @@ bool IsServerValid(const GrpcLbServer& server, size_t idx, bool log) {
536
555
  // Returns addresses extracted from the serverlist.
537
556
  ServerAddressList GrpcLb::Serverlist::GetServerAddressList(
538
557
  GrpcLbClientStats* client_stats) const {
558
+ RefCountedPtr<GrpcLbClientStats> stats;
559
+ if (client_stats != nullptr) stats = client_stats->Ref();
539
560
  ServerAddressList addresses;
540
561
  for (size_t i = 0; i < serverlist_.size(); ++i) {
541
562
  const GrpcLbServer& server = serverlist_[i];
@@ -544,34 +565,23 @@ ServerAddressList GrpcLb::Serverlist::GetServerAddressList(
544
565
  grpc_resolved_address addr;
545
566
  ParseServer(server, &addr);
546
567
  // LB token processing.
547
- char lb_token[GPR_ARRAY_SIZE(server.load_balance_token) + 1];
548
- if (server.load_balance_token[0] != 0) {
549
- const size_t lb_token_max_length =
550
- GPR_ARRAY_SIZE(server.load_balance_token);
551
- const size_t lb_token_length =
552
- strnlen(server.load_balance_token, lb_token_max_length);
553
- memcpy(lb_token, server.load_balance_token, lb_token_length);
554
- lb_token[lb_token_length] = '\0';
555
- } else {
568
+ const size_t lb_token_length = strnlen(
569
+ server.load_balance_token, GPR_ARRAY_SIZE(server.load_balance_token));
570
+ std::string lb_token(server.load_balance_token, lb_token_length);
571
+ if (lb_token.empty()) {
556
572
  gpr_log(GPR_INFO,
557
573
  "Missing LB token for backend address '%s'. The empty token will "
558
574
  "be used instead",
559
575
  grpc_sockaddr_to_uri(&addr).c_str());
560
- lb_token[0] = '\0';
561
576
  }
577
+ // Attach attribute to address containing LB token and stats object.
578
+ std::map<const char*, std::unique_ptr<ServerAddress::AttributeInterface>>
579
+ attributes;
580
+ attributes[kGrpcLbAddressAttributeKey] =
581
+ absl::make_unique<TokenAndClientStatsAttribute>(std::move(lb_token),
582
+ stats);
562
583
  // Add address.
563
- absl::InlinedVector<grpc_arg, 2> args_to_add;
564
- args_to_add.emplace_back(grpc_channel_arg_pointer_create(
565
- const_cast<char*>(GRPC_ARG_GRPCLB_ADDRESS_LB_TOKEN), lb_token,
566
- &lb_token_arg_vtable));
567
- if (client_stats != nullptr) {
568
- args_to_add.emplace_back(grpc_channel_arg_pointer_create(
569
- const_cast<char*>(GRPC_ARG_GRPCLB_ADDRESS_CLIENT_STATS), client_stats,
570
- &client_stats_arg_vtable));
571
- }
572
- grpc_channel_args* args = grpc_channel_args_copy_and_add(
573
- nullptr, args_to_add.data(), args_to_add.size());
574
- addresses.emplace_back(addr, args);
584
+ addresses.emplace_back(addr, /*args=*/nullptr, std::move(attributes));
575
585
  }
576
586
  return addresses;
577
587
  }
@@ -598,7 +608,8 @@ const char* GrpcLb::Serverlist::ShouldDrop() {
598
608
  GrpcLb::PickResult GrpcLb::Picker::Pick(PickArgs args) {
599
609
  PickResult result;
600
610
  // Check if we should drop the call.
601
- const char* drop_token = serverlist_->ShouldDrop();
611
+ const char* drop_token =
612
+ serverlist_ == nullptr ? nullptr : serverlist_->ShouldDrop();
602
613
  if (drop_token != nullptr) {
603
614
  // Update client load reporting stats to indicate the number of
604
615
  // dropped calls. Note that we have to do this here instead of in
@@ -616,15 +627,12 @@ GrpcLb::PickResult GrpcLb::Picker::Pick(PickArgs args) {
616
627
  // If pick succeeded, add LB token to initial metadata.
617
628
  if (result.type == PickResult::PICK_COMPLETE &&
618
629
  result.subchannel != nullptr) {
630
+ const SubchannelWrapper* subchannel_wrapper =
631
+ static_cast<SubchannelWrapper*>(result.subchannel.get());
619
632
  // Encode client stats object into metadata for use by
620
633
  // client_load_reporting filter.
621
- const grpc_arg* arg =
622
- grpc_channel_args_find(result.subchannel->channel_args(),
623
- GRPC_ARG_GRPCLB_ADDRESS_CLIENT_STATS);
624
- if (arg != nullptr && arg->type == GRPC_ARG_POINTER &&
625
- arg->value.pointer.p != nullptr) {
626
- GrpcLbClientStats* client_stats =
627
- static_cast<GrpcLbClientStats*>(arg->value.pointer.p);
634
+ GrpcLbClientStats* client_stats = subchannel_wrapper->client_stats();
635
+ if (client_stats != nullptr) {
628
636
  client_stats->Ref().release(); // Ref passed via metadata.
629
637
  // The metadata value is a hack: we pretend the pointer points to
630
638
  // a string and rely on the client_load_reporting filter to know
@@ -636,15 +644,17 @@ GrpcLb::PickResult GrpcLb::Picker::Pick(PickArgs args) {
636
644
  client_stats->AddCallStarted();
637
645
  }
638
646
  // Encode the LB token in metadata.
639
- arg = grpc_channel_args_find(result.subchannel->channel_args(),
640
- GRPC_ARG_GRPCLB_ADDRESS_LB_TOKEN);
641
- if (arg == nullptr) {
642
- gpr_log(GPR_ERROR, "[grpclb %p picker %p] No LB token for subchannel %p",
643
- parent_, this, result.subchannel.get());
644
- abort();
647
+ // Create a new copy on the call arena, since the subchannel list
648
+ // may get refreshed between when we return this pick and when the
649
+ // initial metadata goes out on the wire.
650
+ if (!subchannel_wrapper->lb_token().empty()) {
651
+ char* lb_token = static_cast<char*>(
652
+ args.call_state->Alloc(subchannel_wrapper->lb_token().size() + 1));
653
+ strcpy(lb_token, subchannel_wrapper->lb_token().c_str());
654
+ args.initial_metadata->Add(kGrpcLbLbTokenMetadataKey, lb_token);
645
655
  }
646
- args.initial_metadata->Add(kGrpcLbLbTokenMetadataKey,
647
- static_cast<char*>(arg->value.pointer.p));
656
+ // Unwrap subchannel to pass up to the channel.
657
+ result.subchannel = subchannel_wrapper->wrapped_subchannel();
648
658
  }
649
659
  return result;
650
660
  }
@@ -654,9 +664,23 @@ GrpcLb::PickResult GrpcLb::Picker::Pick(PickArgs args) {
654
664
  //
655
665
 
656
666
  RefCountedPtr<SubchannelInterface> GrpcLb::Helper::CreateSubchannel(
657
- const grpc_channel_args& args) {
667
+ ServerAddress address, const grpc_channel_args& args) {
658
668
  if (parent_->shutting_down_) return nullptr;
659
- return parent_->channel_control_helper()->CreateSubchannel(args);
669
+ const TokenAndClientStatsAttribute* attribute =
670
+ static_cast<const TokenAndClientStatsAttribute*>(
671
+ address.GetAttribute(kGrpcLbAddressAttributeKey));
672
+ if (attribute == nullptr) {
673
+ gpr_log(GPR_ERROR,
674
+ "[grpclb %p] no TokenAndClientStatsAttribute for address %p",
675
+ parent_.get(), address.ToString().c_str());
676
+ abort();
677
+ }
678
+ std::string lb_token = attribute->lb_token();
679
+ RefCountedPtr<GrpcLbClientStats> client_stats = attribute->client_stats();
680
+ return MakeRefCounted<SubchannelWrapper>(
681
+ parent_->channel_control_helper()->CreateSubchannel(std::move(address),
682
+ args),
683
+ std::move(lb_token), std::move(client_stats));
660
684
  }
661
685
 
662
686
  void GrpcLb::Helper::UpdateState(grpc_connectivity_state state,
@@ -667,56 +691,37 @@ void GrpcLb::Helper::UpdateState(grpc_connectivity_state state,
667
691
  parent_->child_policy_ready_ = state == GRPC_CHANNEL_READY;
668
692
  // Enter fallback mode if needed.
669
693
  parent_->MaybeEnterFallbackModeAfterStartup();
670
- // There are three cases to consider here:
671
- // 1. We're in fallback mode. In this case, we're always going to use
672
- // the child policy's result, so we pass its picker through as-is.
673
- // 2. The serverlist contains only drop entries. In this case, we
674
- // want to use our own picker so that we can return the drops.
675
- // 3. Not in fallback mode and serverlist is not all drops (i.e., it
676
- // may be empty or contain at least one backend address). There are
677
- // two sub-cases:
678
- // a. The child policy is reporting state READY. In this case, we wrap
679
- // the child's picker in our own, so that we can handle drops and LB
680
- // token metadata for each pick.
681
- // b. The child policy is reporting a state other than READY. In this
682
- // case, we don't want to use our own picker, because we don't want
683
- // to process drops for picks that yield a QUEUE result; this would
684
- // result in dropping too many calls, since we will see the
685
- // queued picks multiple times, and we'd consider each one a
686
- // separate call for the drop calculation.
687
- //
688
- // Cases 1 and 3b: return picker from the child policy as-is.
689
- if (parent_->serverlist_ == nullptr ||
690
- (!parent_->serverlist_->ContainsAllDropEntries() &&
691
- state != GRPC_CHANNEL_READY)) {
692
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) {
693
- gpr_log(GPR_INFO,
694
- "[grpclb %p helper %p] state=%s (%s) passing "
695
- "child picker %p as-is",
696
- parent_.get(), this, ConnectivityStateName(state),
697
- status.ToString().c_str(), picker.get());
698
- }
699
- parent_->channel_control_helper()->UpdateState(state, status,
700
- std::move(picker));
701
- return;
702
- }
703
- // Cases 2 and 3a: wrap picker from the child in our own picker.
704
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) {
705
- gpr_log(GPR_INFO,
706
- "[grpclb %p helper %p] state=%s (%s) wrapping child "
707
- "picker %p",
708
- parent_.get(), this, ConnectivityStateName(state),
709
- status.ToString().c_str(), picker.get());
694
+ // We pass the serverlist to the picker so that it can handle drops.
695
+ // However, we don't want to handle drops in the case where the child
696
+ // policy is reporting a state other than READY (unless we are
697
+ // dropping *all* calls), because we don't want to process drops for picks
698
+ // that yield a QUEUE result; this would result in dropping too many calls,
699
+ // since we will see the queued picks multiple times, and we'd consider each
700
+ // one a separate call for the drop calculation. So in this case, we pass
701
+ // a null serverlist to the picker, which tells it not to do drops.
702
+ RefCountedPtr<Serverlist> serverlist;
703
+ if (state == GRPC_CHANNEL_READY ||
704
+ (parent_->serverlist_ != nullptr &&
705
+ parent_->serverlist_->ContainsAllDropEntries())) {
706
+ serverlist = parent_->serverlist_;
710
707
  }
711
708
  RefCountedPtr<GrpcLbClientStats> client_stats;
712
709
  if (parent_->lb_calld_ != nullptr &&
713
710
  parent_->lb_calld_->client_stats() != nullptr) {
714
711
  client_stats = parent_->lb_calld_->client_stats()->Ref();
715
712
  }
713
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) {
714
+ gpr_log(GPR_INFO,
715
+ "[grpclb %p helper %p] state=%s (%s) wrapping child "
716
+ "picker %p (serverlist=%p, client_stats=%p)",
717
+ parent_.get(), this, ConnectivityStateName(state),
718
+ status.ToString().c_str(), picker.get(), serverlist.get(),
719
+ client_stats.get());
720
+ }
716
721
  parent_->channel_control_helper()->UpdateState(
717
722
  state, status,
718
- absl::make_unique<Picker>(parent_.get(), parent_->serverlist_,
719
- std::move(picker), std::move(client_stats)));
723
+ absl::make_unique<Picker>(std::move(serverlist), std::move(picker),
724
+ std::move(client_stats)));
720
725
  }
721
726
 
722
727
  void GrpcLb::Helper::RequestReresolution() {
@@ -743,15 +748,16 @@ void GrpcLb::Helper::AddTraceEvent(TraceSeverity severity,
743
748
 
744
749
  GrpcLb::BalancerCallState::BalancerCallState(
745
750
  RefCountedPtr<LoadBalancingPolicy> parent_grpclb_policy)
746
- : InternallyRefCounted<BalancerCallState>(&grpc_lb_glb_trace),
751
+ : InternallyRefCounted<BalancerCallState>(
752
+ GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace) ? "BalancerCallState"
753
+ : nullptr),
747
754
  grpclb_policy_(std::move(parent_grpclb_policy)) {
748
755
  GPR_ASSERT(grpclb_policy_ != nullptr);
749
756
  GPR_ASSERT(!grpclb_policy()->shutting_down_);
750
757
  // Init the LB call. Note that the LB call will progress every time there's
751
758
  // activity in grpclb_policy_->interested_parties(), which is comprised of
752
759
  // the polling entities from client_channel.
753
- GPR_ASSERT(grpclb_policy()->server_name_ != nullptr);
754
- GPR_ASSERT(grpclb_policy()->server_name_[0] != '\0');
760
+ GPR_ASSERT(!grpclb_policy()->server_name_.empty());
755
761
  // Closure Initialization
756
762
  GRPC_CLOSURE_INIT(&lb_on_initial_request_sent_, OnInitialRequestSent, this,
757
763
  grpc_schedule_on_exec_ctx);
@@ -774,7 +780,7 @@ GrpcLb::BalancerCallState::BalancerCallState(
774
780
  upb::Arena arena;
775
781
  grpc_slice request_payload_slice = GrpcLbRequestCreate(
776
782
  grpclb_policy()->config_->service_name().empty()
777
- ? grpclb_policy()->server_name_
783
+ ? grpclb_policy()->server_name_.c_str()
778
784
  : grpclb_policy()->config_->service_name().c_str(),
779
785
  arena.ptr());
780
786
  send_message_payload_ =
@@ -840,8 +846,9 @@ void GrpcLb::BalancerCallState::StartQuery() {
840
846
  // with the callback.
841
847
  auto self = Ref(DEBUG_LOCATION, "on_initial_request_sent");
842
848
  self.release();
843
- call_error = grpc_call_start_batch_and_execute(
844
- lb_call_, ops, (size_t)(op - ops), &lb_on_initial_request_sent_);
849
+ call_error = grpc_call_start_batch_and_execute(lb_call_, ops,
850
+ static_cast<size_t>(op - ops),
851
+ &lb_on_initial_request_sent_);
845
852
  GPR_ASSERT(GRPC_CALL_OK == call_error);
846
853
  // Op: recv initial metadata.
847
854
  op = ops;
@@ -863,7 +870,8 @@ void GrpcLb::BalancerCallState::StartQuery() {
863
870
  self = Ref(DEBUG_LOCATION, "on_message_received");
864
871
  self.release();
865
872
  call_error = grpc_call_start_batch_and_execute(
866
- lb_call_, ops, (size_t)(op - ops), &lb_on_balancer_message_received_);
873
+ lb_call_, ops, static_cast<size_t>(op - ops),
874
+ &lb_on_balancer_message_received_);
867
875
  GPR_ASSERT(GRPC_CALL_OK == call_error);
868
876
  // Op: recv server status.
869
877
  op = ops;
@@ -879,7 +887,8 @@ void GrpcLb::BalancerCallState::StartQuery() {
879
887
  // ref instead of a new ref. When it's invoked, it's the initial ref that is
880
888
  // unreffed.
881
889
  call_error = grpc_call_start_batch_and_execute(
882
- lb_call_, ops, (size_t)(op - ops), &lb_on_balancer_status_received_);
890
+ lb_call_, ops, static_cast<size_t>(op - ops),
891
+ &lb_on_balancer_status_received_);
883
892
  GPR_ASSERT(GRPC_CALL_OK == call_error);
884
893
  }
885
894
 
@@ -937,7 +946,7 @@ void GrpcLb::BalancerCallState::SendClientLoadReportLocked() {
937
946
  if (num_calls_started == 0 && num_calls_finished == 0 &&
938
947
  num_calls_finished_with_client_failed_to_send == 0 &&
939
948
  num_calls_finished_known_received == 0 &&
940
- (drop_token_counts == nullptr || drop_token_counts->size() == 0)) {
949
+ (drop_token_counts == nullptr || drop_token_counts->empty())) {
941
950
  if (last_client_load_report_counters_were_zero_) {
942
951
  ScheduleNextClientLoadReportLocked();
943
952
  return;
@@ -1287,25 +1296,18 @@ grpc_channel_args* BuildBalancerChannelArgs(
1287
1296
  GRPC_ARG_CHANNELZ_CHANNEL_NODE,
1288
1297
  };
1289
1298
  // Channel args to add.
1290
- absl::InlinedVector<grpc_arg, 3> args_to_add;
1291
- // The fake resolver response generator, which we use to inject
1292
- // address updates into the LB channel.
1293
- args_to_add.emplace_back(
1299
+ absl::InlinedVector<grpc_arg, 3> args_to_add = {
1300
+ // The fake resolver response generator, which we use to inject
1301
+ // address updates into the LB channel.
1294
1302
  grpc_core::FakeResolverResponseGenerator::MakeChannelArg(
1295
- response_generator));
1296
- // A channel arg indicating the target is a grpclb load balancer.
1297
- args_to_add.emplace_back(grpc_channel_arg_integer_create(
1298
- const_cast<char*>(GRPC_ARG_ADDRESS_IS_GRPCLB_LOAD_BALANCER), 1));
1299
- // The parent channel's channelz uuid.
1300
- channelz::ChannelNode* channelz_node = nullptr;
1301
- const grpc_arg* arg =
1302
- grpc_channel_args_find(args, GRPC_ARG_CHANNELZ_CHANNEL_NODE);
1303
- if (arg != nullptr && arg->type == GRPC_ARG_POINTER &&
1304
- arg->value.pointer.p != nullptr) {
1305
- channelz_node = static_cast<channelz::ChannelNode*>(arg->value.pointer.p);
1306
- args_to_add.emplace_back(
1307
- channelz::MakeParentUuidArg(channelz_node->uuid()));
1308
- }
1303
+ response_generator),
1304
+ // A channel arg indicating the target is a grpclb load balancer.
1305
+ grpc_channel_arg_integer_create(
1306
+ const_cast<char*>(GRPC_ARG_ADDRESS_IS_GRPCLB_LOAD_BALANCER), 1),
1307
+ // Tells channelz that this is an internal channel.
1308
+ grpc_channel_arg_integer_create(
1309
+ const_cast<char*>(GRPC_ARG_CHANNELZ_IS_INTERNAL_CHANNEL), 1),
1310
+ };
1309
1311
  // Construct channel args.
1310
1312
  grpc_channel_args* new_args = grpc_channel_args_copy_and_add_and_remove(
1311
1313
  args, args_to_remove, GPR_ARRAY_SIZE(args_to_remove), args_to_add.data(),
@@ -1338,15 +1340,14 @@ GrpcLb::GrpcLb(Args args)
1338
1340
  const grpc_arg* arg = grpc_channel_args_find(args.args, GRPC_ARG_SERVER_URI);
1339
1341
  const char* server_uri = grpc_channel_arg_get_string(arg);
1340
1342
  GPR_ASSERT(server_uri != nullptr);
1341
- grpc_uri* uri = grpc_uri_parse(server_uri, true);
1342
- GPR_ASSERT(uri->path[0] != '\0');
1343
- server_name_ = gpr_strdup(uri->path[0] == '/' ? uri->path + 1 : uri->path);
1343
+ absl::StatusOr<URI> uri = URI::Parse(server_uri);
1344
+ GPR_ASSERT(uri.ok() && !uri->path().empty());
1345
+ server_name_ = std::string(absl::StripPrefix(uri->path(), "/"));
1344
1346
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) {
1345
1347
  gpr_log(GPR_INFO,
1346
1348
  "[grpclb %p] Will use '%s' as the server name for LB request.",
1347
- this, server_name_);
1349
+ this, server_name_.c_str());
1348
1350
  }
1349
- grpc_uri_destroy(uri);
1350
1351
  // Record LB call timeout.
1351
1352
  arg = grpc_channel_args_find(args.args, GRPC_ARG_GRPCLB_CALL_TIMEOUT_MS);
1352
1353
  lb_call_timeout_ms_ = grpc_channel_arg_get_integer(arg, {0, 0, INT_MAX});
@@ -1356,10 +1357,7 @@ GrpcLb::GrpcLb(Args args)
1356
1357
  arg, {GRPC_GRPCLB_DEFAULT_FALLBACK_TIMEOUT_MS, 0, INT_MAX});
1357
1358
  }
1358
1359
 
1359
- GrpcLb::~GrpcLb() {
1360
- gpr_free((void*)server_name_);
1361
- grpc_channel_args_destroy(args_);
1362
- }
1360
+ GrpcLb::~GrpcLb() { grpc_channel_args_destroy(args_); }
1363
1361
 
1364
1362
  void GrpcLb::ShutdownLocked() {
1365
1363
  shutting_down_ = true;
@@ -1382,6 +1380,12 @@ void GrpcLb::ShutdownLocked() {
1382
1380
  // OnBalancerChannelConnectivityChangedLocked(), and we need to be
1383
1381
  // alive when that callback is invoked.
1384
1382
  if (lb_channel_ != nullptr) {
1383
+ if (parent_channelz_node_ != nullptr) {
1384
+ channelz::ChannelNode* child_channelz_node =
1385
+ grpc_channel_get_channelz_node(lb_channel_);
1386
+ GPR_ASSERT(child_channelz_node != nullptr);
1387
+ parent_channelz_node_->RemoveChildChannel(child_channelz_node->uuid());
1388
+ }
1385
1389
  grpc_channel_destroy(lb_channel_);
1386
1390
  lb_channel_ = nullptr;
1387
1391
  }
@@ -1435,17 +1439,13 @@ void GrpcLb::UpdateLocked(UpdateArgs args) {
1435
1439
  // helpers for UpdateLocked()
1436
1440
  //
1437
1441
 
1438
- ServerAddressList AddNullLbTokenToAddresses(
1442
+ ServerAddressList GrpcLb::AddNullLbTokenToAddresses(
1439
1443
  const ServerAddressList& addresses) {
1440
- static const char* lb_token = "";
1441
- grpc_arg arg = grpc_channel_arg_pointer_create(
1442
- const_cast<char*>(GRPC_ARG_GRPCLB_ADDRESS_LB_TOKEN),
1443
- const_cast<char*>(lb_token), &lb_token_arg_vtable);
1444
1444
  ServerAddressList addresses_out;
1445
- for (size_t i = 0; i < addresses.size(); ++i) {
1446
- addresses_out.emplace_back(
1447
- addresses[i].address(),
1448
- grpc_channel_args_copy_and_add(addresses[i].args(), &arg, 1));
1445
+ for (const ServerAddress& address : addresses) {
1446
+ addresses_out.emplace_back(address.WithAttribute(
1447
+ kGrpcLbAddressAttributeKey,
1448
+ absl::make_unique<TokenAndClientStatsAttribute>("", nullptr)));
1449
1449
  }
1450
1450
  return addresses_out;
1451
1451
  }
@@ -1458,7 +1458,7 @@ void GrpcLb::ProcessAddressesAndChannelArgsLocked(
1458
1458
  // since we use this to trigger the client_load_reporting filter.
1459
1459
  static const char* args_to_remove[] = {GRPC_ARG_LB_POLICY_NAME};
1460
1460
  grpc_arg new_arg = grpc_channel_arg_string_create(
1461
- (char*)GRPC_ARG_LB_POLICY_NAME, (char*)"grpclb");
1461
+ const_cast<char*>(GRPC_ARG_LB_POLICY_NAME), const_cast<char*>("grpclb"));
1462
1462
  grpc_channel_args_destroy(args_);
1463
1463
  args_ = grpc_channel_args_copy_and_add_and_remove(
1464
1464
  &args, args_to_remove, GPR_ARRAY_SIZE(args_to_remove), &new_arg, 1);
@@ -1472,6 +1472,16 @@ void GrpcLb::ProcessAddressesAndChannelArgsLocked(
1472
1472
  lb_channel_ =
1473
1473
  CreateGrpclbBalancerChannel(uri_str.c_str(), *lb_channel_args);
1474
1474
  GPR_ASSERT(lb_channel_ != nullptr);
1475
+ // Set up channelz linkage.
1476
+ channelz::ChannelNode* child_channelz_node =
1477
+ grpc_channel_get_channelz_node(lb_channel_);
1478
+ channelz::ChannelNode* parent_channelz_node =
1479
+ grpc_channel_args_find_pointer<channelz::ChannelNode>(
1480
+ &args, GRPC_ARG_CHANNELZ_CHANNEL_NODE);
1481
+ if (child_channelz_node != nullptr && parent_channelz_node != nullptr) {
1482
+ parent_channelz_node->AddChildChannel(child_channelz_node->uuid());
1483
+ parent_channelz_node_ = parent_channelz_node->Ref();
1484
+ }
1475
1485
  }
1476
1486
  // Propagate updates to the LB channel (pick_first) through the fake
1477
1487
  // resolver.
@@ -1757,7 +1767,8 @@ bool maybe_add_client_load_reporting_filter(grpc_channel_stack_builder* builder,
1757
1767
  // will minimize the number of metadata elements that the filter
1758
1768
  // needs to iterate through to find the ClientStats object.
1759
1769
  return grpc_channel_stack_builder_prepend_filter(
1760
- builder, (const grpc_channel_filter*)arg, nullptr, nullptr);
1770
+ builder, static_cast<const grpc_channel_filter*>(arg), nullptr,
1771
+ nullptr);
1761
1772
  }
1762
1773
  return true;
1763
1774
  }
@@ -1768,10 +1779,10 @@ void grpc_lb_policy_grpclb_init() {
1768
1779
  grpc_core::LoadBalancingPolicyRegistry::Builder::
1769
1780
  RegisterLoadBalancingPolicyFactory(
1770
1781
  absl::make_unique<grpc_core::GrpcLbFactory>());
1771
- grpc_channel_init_register_stage(GRPC_CLIENT_SUBCHANNEL,
1772
- GRPC_CHANNEL_INIT_BUILTIN_PRIORITY,
1773
- maybe_add_client_load_reporting_filter,
1774
- (void*)&grpc_client_load_reporting_filter);
1782
+ grpc_channel_init_register_stage(
1783
+ GRPC_CLIENT_SUBCHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY,
1784
+ maybe_add_client_load_reporting_filter,
1785
+ const_cast<grpc_channel_filter*>(&grpc_client_load_reporting_filter));
1775
1786
  }
1776
1787
 
1777
1788
  void grpc_lb_policy_grpclb_shutdown() {}