grpc 1.26.0 → 1.28.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 (829) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +1699 -1482
  3. data/etc/roots.pem +44 -0
  4. data/include/grpc/grpc_security.h +37 -15
  5. data/include/grpc/grpc_security_constants.h +27 -0
  6. data/include/grpc/impl/codegen/grpc_types.h +19 -0
  7. data/include/grpc/impl/codegen/port_platform.h +8 -1
  8. data/include/grpc/impl/codegen/sync.h +5 -3
  9. data/include/grpc/impl/codegen/sync_abseil.h +36 -0
  10. data/include/grpc/module.modulemap +3 -0
  11. data/{src/core/lib/json/json_common.h → include/grpc/support/sync_abseil.h} +7 -15
  12. data/src/core/ext/filters/client_channel/client_channel.cc +74 -32
  13. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +31 -47
  14. data/src/core/ext/filters/client_channel/client_channel_channelz.h +1 -3
  15. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
  16. data/src/core/ext/filters/client_channel/http_proxy.cc +8 -5
  17. data/src/core/ext/filters/client_channel/lb_policy.cc +4 -3
  18. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +291 -0
  19. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +83 -0
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +224 -367
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +88 -121
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +28 -57
  23. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +18 -21
  24. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +9 -13
  25. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +85 -83
  26. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +623 -767
  27. data/src/core/ext/filters/client_channel/lb_policy_factory.h +3 -3
  28. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +43 -75
  29. data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -1
  30. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +57 -70
  31. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +1 -1
  32. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +1 -1
  33. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +1 -1
  34. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +3 -3
  35. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +2 -2
  36. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -1
  37. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +3 -3
  38. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +31 -7
  39. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +228 -286
  40. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +2 -2
  41. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +37 -176
  42. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +7 -11
  43. data/src/core/ext/filters/client_channel/service_config.cc +91 -160
  44. data/src/core/ext/filters/client_channel/service_config.h +14 -21
  45. data/src/core/ext/filters/client_channel/xds/xds_api.cc +1426 -229
  46. data/src/core/ext/filters/client_channel/xds/xds_api.h +214 -115
  47. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +236 -339
  48. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +32 -45
  49. data/src/core/ext/filters/client_channel/xds/xds_channel.h +3 -1
  50. data/src/core/ext/filters/client_channel/xds/xds_channel_secure.cc +14 -9
  51. data/src/core/ext/filters/client_channel/xds/xds_client.cc +986 -252
  52. data/src/core/ext/filters/client_channel/xds/xds_client.h +84 -36
  53. data/src/core/ext/filters/client_channel/xds/xds_client_stats.cc +53 -131
  54. data/src/core/ext/filters/client_channel/xds/xds_client_stats.h +119 -152
  55. data/src/core/ext/filters/message_size/message_size_filter.cc +32 -35
  56. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  57. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +3 -6
  58. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +6 -8
  59. data/src/core/ext/transport/chttp2/transport/writing.cc +1 -1
  60. data/src/core/ext/transport/inproc/inproc_transport.cc +22 -42
  61. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +17 -0
  62. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +30 -0
  63. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +27 -0
  64. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +54 -0
  65. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +46 -21
  66. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +116 -29
  67. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.c +4 -362
  68. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +14 -1337
  69. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +390 -0
  70. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +1411 -0
  71. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +29 -8
  72. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +60 -0
  73. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c +1 -0
  74. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c +1 -0
  75. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +5 -3
  76. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +6 -2
  77. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +48 -5
  78. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +154 -4
  79. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +19 -15
  80. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +46 -32
  81. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +26 -4
  82. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +70 -0
  83. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +42 -25
  84. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +83 -25
  85. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c +1 -0
  86. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +43 -7
  87. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +115 -0
  88. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +1 -0
  89. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.c +7 -68
  90. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +14 -201
  91. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +91 -0
  92. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h +240 -0
  93. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +1 -71
  94. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +3 -228
  95. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +88 -0
  96. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +258 -0
  97. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +1 -0
  98. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.c +30 -0
  99. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.h +53 -0
  100. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +104 -0
  101. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +383 -0
  102. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +17 -0
  103. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h +33 -0
  104. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +144 -0
  105. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h +527 -0
  106. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +42 -0
  107. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h +112 -0
  108. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.c +29 -0
  109. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.h +53 -0
  110. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +62 -0
  111. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.h +199 -0
  112. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +17 -0
  113. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h +33 -0
  114. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +793 -0
  115. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +2936 -0
  116. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +58 -0
  117. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h +134 -0
  118. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.c +27 -0
  119. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.h +53 -0
  120. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +227 -0
  121. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h +725 -0
  122. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +296 -0
  123. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +1072 -0
  124. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c +32 -0
  125. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h +65 -0
  126. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +47 -0
  127. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +108 -0
  128. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +52 -0
  129. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.h +133 -0
  130. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +87 -0
  131. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h +258 -0
  132. data/src/core/ext/upb-generated/envoy/type/range.upb.c +11 -0
  133. data/src/core/ext/upb-generated/envoy/type/range.upb.h +27 -0
  134. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.c +28 -0
  135. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.h +62 -0
  136. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +88 -0
  137. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h +249 -0
  138. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +30 -27
  139. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +64 -52
  140. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +13 -5
  141. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +34 -0
  142. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +48 -0
  143. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +104 -0
  144. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +17 -0
  145. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +30 -0
  146. data/src/core/ext/upb-generated/validate/validate.upb.c +38 -34
  147. data/src/core/ext/upb-generated/validate/validate.upb.h +129 -99
  148. data/src/core/lib/channel/channel_trace.cc +32 -41
  149. data/src/core/lib/channel/channel_trace.h +3 -3
  150. data/src/core/lib/channel/channelz.cc +158 -248
  151. data/src/core/lib/channel/channelz.h +17 -10
  152. data/src/core/lib/channel/channelz_registry.cc +47 -74
  153. data/src/core/lib/channel/channelz_registry.h +4 -4
  154. data/src/core/lib/gpr/sync_abseil.cc +114 -0
  155. data/src/core/lib/gpr/sync_posix.cc +8 -5
  156. data/src/core/lib/gpr/sync_windows.cc +4 -2
  157. data/src/core/lib/gpr/time_precise.cc +1 -1
  158. data/src/core/lib/gprpp/host_port.cc +1 -1
  159. data/src/core/lib/gprpp/inlined_vector.h +1 -210
  160. data/src/core/lib/gprpp/memory.h +2 -6
  161. data/src/core/lib/gprpp/optional.h +6 -21
  162. data/src/core/lib/gprpp/string_view.h +5 -110
  163. data/src/core/lib/gprpp/sync.h +9 -0
  164. data/src/core/lib/iomgr/buffer_list.cc +36 -35
  165. data/src/core/lib/iomgr/error.h +4 -4
  166. data/src/core/lib/iomgr/ev_epollex_linux.cc +12 -4
  167. data/src/core/lib/iomgr/executor.cc +1 -1
  168. data/src/core/lib/iomgr/fork_posix.cc +4 -0
  169. data/src/core/lib/iomgr/load_file.cc +1 -0
  170. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +87 -0
  171. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +88 -0
  172. data/src/core/lib/iomgr/socket_utils_common_posix.cc +14 -0
  173. data/src/core/lib/iomgr/socket_utils_posix.h +12 -0
  174. data/src/core/lib/iomgr/tcp_client_posix.cc +17 -17
  175. data/src/core/lib/iomgr/tcp_client_posix.h +6 -6
  176. data/src/core/lib/iomgr/tcp_custom.h +3 -0
  177. data/src/core/lib/iomgr/tcp_posix.cc +608 -56
  178. data/src/core/lib/iomgr/tcp_server_custom.cc +15 -2
  179. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +8 -0
  180. data/src/core/lib/iomgr/work_serializer.cc +155 -0
  181. data/src/core/lib/iomgr/work_serializer.h +65 -0
  182. data/src/core/lib/json/json.h +208 -68
  183. data/src/core/lib/json/json_reader.cc +511 -319
  184. data/src/core/lib/json/json_writer.cc +201 -110
  185. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +1 -1
  186. data/src/core/lib/security/credentials/composite/composite_credentials.cc +7 -0
  187. data/src/core/lib/security/credentials/composite/composite_credentials.h +5 -1
  188. data/src/core/lib/security/credentials/credentials.h +10 -1
  189. data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -1
  190. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +10 -8
  191. data/src/core/lib/security/credentials/jwt/json_token.cc +26 -56
  192. data/src/core/lib/security/credentials/jwt/json_token.h +2 -1
  193. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +8 -18
  194. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +149 -159
  195. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -3
  196. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +38 -35
  197. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
  198. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -4
  199. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -1
  200. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +20 -0
  201. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +9 -0
  202. data/src/core/lib/security/credentials/tls/{spiffe_credentials.cc → tls_credentials.cc} +23 -24
  203. data/src/core/lib/security/credentials/tls/{spiffe_credentials.h → tls_credentials.h} +9 -9
  204. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +13 -0
  205. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +22 -2
  206. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +2 -2
  207. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +2 -2
  208. data/src/core/lib/security/security_connector/local/local_security_connector.cc +31 -6
  209. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +3 -15
  210. data/src/core/lib/security/security_connector/ssl_utils.cc +48 -4
  211. data/src/core/lib/security/security_connector/ssl_utils.h +12 -1
  212. data/src/core/lib/security/security_connector/tls/{spiffe_security_connector.cc → tls_security_connector.cc} +106 -70
  213. data/src/core/lib/security/security_connector/tls/{spiffe_security_connector.h → tls_security_connector.h} +22 -19
  214. data/src/core/lib/security/transport/client_auth_filter.cc +33 -0
  215. data/src/core/lib/security/transport/security_handshaker.cc +2 -2
  216. data/src/core/lib/security/util/json_util.cc +22 -15
  217. data/src/core/lib/security/util/json_util.h +2 -2
  218. data/src/core/lib/surface/completion_queue.cc +22 -1
  219. data/src/core/lib/surface/version.cc +1 -1
  220. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  221. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +12 -2
  222. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +1 -1
  223. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +3 -3
  224. data/src/core/tsi/fake_transport_security.cc +7 -3
  225. data/src/core/tsi/fake_transport_security.h +2 -0
  226. data/src/core/tsi/grpc_shadow_boringssl.h +1333 -1319
  227. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
  228. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +1 -1
  229. data/src/core/tsi/ssl_transport_security.cc +145 -8
  230. data/src/core/tsi/ssl_transport_security.h +15 -1
  231. data/src/core/tsi/transport_security.cc +13 -0
  232. data/src/core/tsi/transport_security_grpc.cc +2 -2
  233. data/src/core/tsi/transport_security_grpc.h +2 -2
  234. data/src/core/tsi/transport_security_interface.h +12 -0
  235. data/src/ruby/bin/math_pb.rb +5 -5
  236. data/src/ruby/ext/grpc/rb_call_credentials.c +4 -1
  237. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  238. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -1
  239. data/src/ruby/lib/grpc/version.rb +1 -1
  240. data/src/ruby/pb/grpc/health/v1/health_pb.rb +3 -3
  241. data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +1 -1
  242. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +23 -13
  243. data/third_party/abseil-cpp/absl/algorithm/algorithm.h +159 -0
  244. data/third_party/abseil-cpp/absl/base/attributes.h +621 -0
  245. data/third_party/abseil-cpp/absl/base/call_once.h +226 -0
  246. data/third_party/abseil-cpp/absl/base/casts.h +184 -0
  247. data/third_party/abseil-cpp/absl/base/config.h +671 -0
  248. data/third_party/abseil-cpp/absl/base/const_init.h +76 -0
  249. data/third_party/abseil-cpp/absl/base/dynamic_annotations.cc +129 -0
  250. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +389 -0
  251. data/third_party/abseil-cpp/absl/base/internal/atomic_hook.h +200 -0
  252. data/third_party/abseil-cpp/absl/base/internal/bits.h +218 -0
  253. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +107 -0
  254. data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +94 -0
  255. data/third_party/abseil-cpp/absl/base/internal/endian.h +266 -0
  256. data/third_party/abseil-cpp/absl/base/internal/errno_saver.h +43 -0
  257. data/third_party/abseil-cpp/absl/base/internal/hide_ptr.h +51 -0
  258. data/third_party/abseil-cpp/absl/base/internal/identity.h +37 -0
  259. data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +107 -0
  260. data/third_party/abseil-cpp/absl/base/internal/invoke.h +187 -0
  261. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +107 -0
  262. data/third_party/abseil-cpp/absl/base/internal/per_thread_tls.h +52 -0
  263. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +240 -0
  264. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +183 -0
  265. data/third_party/abseil-cpp/absl/base/internal/scheduling_mode.h +58 -0
  266. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +233 -0
  267. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +243 -0
  268. data/third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc +35 -0
  269. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +66 -0
  270. data/third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc +46 -0
  271. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.cc +81 -0
  272. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +93 -0
  273. data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +37 -0
  274. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +416 -0
  275. data/third_party/abseil-cpp/absl/base/internal/sysinfo.h +66 -0
  276. data/third_party/abseil-cpp/absl/base/internal/thread_annotations.h +271 -0
  277. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +152 -0
  278. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +259 -0
  279. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +108 -0
  280. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.h +75 -0
  281. data/third_party/abseil-cpp/absl/base/internal/tsan_mutex_interface.h +66 -0
  282. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +158 -0
  283. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +140 -0
  284. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +124 -0
  285. data/third_party/abseil-cpp/absl/base/log_severity.cc +27 -0
  286. data/third_party/abseil-cpp/absl/base/log_severity.h +121 -0
  287. data/third_party/abseil-cpp/absl/base/macros.h +220 -0
  288. data/third_party/abseil-cpp/absl/base/optimization.h +181 -0
  289. data/third_party/abseil-cpp/absl/base/options.h +211 -0
  290. data/third_party/abseil-cpp/absl/base/policy_checks.h +111 -0
  291. data/third_party/abseil-cpp/absl/base/port.h +26 -0
  292. data/third_party/abseil-cpp/absl/base/thread_annotations.h +280 -0
  293. data/third_party/abseil-cpp/absl/container/inlined_vector.h +848 -0
  294. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +265 -0
  295. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +892 -0
  296. data/third_party/abseil-cpp/absl/memory/memory.h +695 -0
  297. data/third_party/abseil-cpp/absl/meta/type_traits.h +759 -0
  298. data/third_party/abseil-cpp/absl/numeric/int128.cc +404 -0
  299. data/third_party/abseil-cpp/absl/numeric/int128.h +1091 -0
  300. data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +302 -0
  301. data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +308 -0
  302. data/third_party/abseil-cpp/absl/strings/ascii.cc +200 -0
  303. data/third_party/abseil-cpp/absl/strings/ascii.h +242 -0
  304. data/third_party/abseil-cpp/absl/strings/charconv.cc +984 -0
  305. data/third_party/abseil-cpp/absl/strings/charconv.h +119 -0
  306. data/third_party/abseil-cpp/absl/strings/escaping.cc +949 -0
  307. data/third_party/abseil-cpp/absl/strings/escaping.h +164 -0
  308. data/third_party/abseil-cpp/absl/strings/internal/char_map.h +156 -0
  309. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +359 -0
  310. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h +423 -0
  311. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +504 -0
  312. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.h +99 -0
  313. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +180 -0
  314. data/third_party/abseil-cpp/absl/strings/internal/escaping.h +58 -0
  315. data/third_party/abseil-cpp/absl/strings/internal/memutil.cc +112 -0
  316. data/third_party/abseil-cpp/absl/strings/internal/memutil.h +148 -0
  317. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +36 -0
  318. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.h +89 -0
  319. data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +73 -0
  320. data/third_party/abseil-cpp/absl/strings/internal/stl_type_traits.h +248 -0
  321. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +388 -0
  322. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +432 -0
  323. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +245 -0
  324. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +209 -0
  325. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +326 -0
  326. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +51 -0
  327. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +415 -0
  328. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +493 -0
  329. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +23 -0
  330. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.cc +72 -0
  331. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +104 -0
  332. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +334 -0
  333. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +333 -0
  334. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +314 -0
  335. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +455 -0
  336. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +53 -0
  337. data/third_party/abseil-cpp/absl/strings/internal/utf8.h +50 -0
  338. data/third_party/abseil-cpp/absl/strings/match.cc +40 -0
  339. data/third_party/abseil-cpp/absl/strings/match.h +90 -0
  340. data/third_party/abseil-cpp/absl/strings/numbers.cc +965 -0
  341. data/third_party/abseil-cpp/absl/strings/numbers.h +266 -0
  342. data/third_party/abseil-cpp/absl/strings/str_cat.cc +246 -0
  343. data/third_party/abseil-cpp/absl/strings/str_cat.h +408 -0
  344. data/third_party/abseil-cpp/absl/strings/str_format.h +537 -0
  345. data/third_party/abseil-cpp/absl/strings/str_join.h +293 -0
  346. data/third_party/abseil-cpp/absl/strings/str_replace.cc +82 -0
  347. data/third_party/abseil-cpp/absl/strings/str_replace.h +219 -0
  348. data/third_party/abseil-cpp/absl/strings/str_split.cc +139 -0
  349. data/third_party/abseil-cpp/absl/strings/str_split.h +513 -0
  350. data/third_party/abseil-cpp/absl/strings/string_view.cc +235 -0
  351. data/third_party/abseil-cpp/absl/strings/string_view.h +622 -0
  352. data/third_party/abseil-cpp/absl/strings/strip.h +91 -0
  353. data/third_party/abseil-cpp/absl/strings/substitute.cc +171 -0
  354. data/third_party/abseil-cpp/absl/strings/substitute.h +693 -0
  355. data/third_party/abseil-cpp/absl/types/bad_optional_access.cc +48 -0
  356. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +78 -0
  357. data/third_party/abseil-cpp/absl/types/internal/optional.h +396 -0
  358. data/third_party/abseil-cpp/absl/types/internal/span.h +128 -0
  359. data/third_party/abseil-cpp/absl/types/optional.h +776 -0
  360. data/third_party/abseil-cpp/absl/types/span.h +713 -0
  361. data/third_party/abseil-cpp/absl/utility/utility.h +350 -0
  362. data/{src/boringssl → third_party/boringssl-with-bazel}/err_data.c +0 -0
  363. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_bitstr.c +0 -0
  364. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_bool.c +0 -0
  365. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_d2i_fp.c +0 -0
  366. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_dup.c +0 -0
  367. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_enum.c +0 -0
  368. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_gentm.c +0 -0
  369. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_i2d_fp.c +0 -0
  370. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_int.c +0 -0
  371. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_mbstr.c +0 -0
  372. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_object.c +0 -0
  373. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_octet.c +0 -0
  374. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_print.c +0 -0
  375. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_strnid.c +0 -0
  376. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_time.c +3 -4
  377. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_type.c +0 -0
  378. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_utctm.c +0 -0
  379. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_utf8.c +0 -0
  380. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/asn1_lib.c +0 -0
  381. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/asn1_locl.h +0 -0
  382. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/asn1_par.c +0 -0
  383. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/asn_pack.c +0 -0
  384. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/f_enum.c +0 -0
  385. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/f_int.c +0 -0
  386. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/f_string.c +0 -0
  387. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_dec.c +0 -0
  388. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_enc.c +0 -0
  389. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_fre.c +0 -0
  390. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_new.c +0 -0
  391. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_typ.c +0 -0
  392. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_utl.c +0 -0
  393. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/time_support.c +0 -0
  394. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/base64/base64.c +0 -0
  395. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/bio.c +0 -0
  396. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/bio_mem.c +0 -0
  397. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/connect.c +3 -4
  398. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/fd.c +0 -1
  399. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/file.c +5 -6
  400. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/hexdump.c +0 -0
  401. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/internal.h +0 -0
  402. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/pair.c +0 -1
  403. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/printf.c +0 -0
  404. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/socket.c +0 -0
  405. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/socket_helper.c +0 -0
  406. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bn_extra/bn_asn1.c +0 -0
  407. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bn_extra/convert.c +0 -0
  408. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/buf/buf.c +10 -69
  409. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bytestring/asn1_compat.c +0 -0
  410. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bytestring/ber.c +0 -0
  411. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bytestring/cbb.c +41 -2
  412. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bytestring/cbs.c +60 -3
  413. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bytestring/internal.h +0 -0
  414. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bytestring/unicode.c +0 -0
  415. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/chacha/chacha.c +0 -0
  416. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/chacha/internal.h +0 -0
  417. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/cipher_extra.c +0 -0
  418. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/derive_key.c +0 -0
  419. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_aesccm.c +0 -0
  420. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_aesctrhmac.c +0 -0
  421. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_aesgcmsiv.c +8 -0
  422. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_chacha20poly1305.c +0 -0
  423. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_null.c +0 -0
  424. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_rc2.c +0 -0
  425. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_rc4.c +0 -0
  426. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_tls.c +0 -0
  427. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/internal.h +0 -0
  428. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/tls_cbc.c +0 -0
  429. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cmac/cmac.c +0 -0
  430. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/conf/conf.c +0 -0
  431. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/conf/conf_def.h +0 -0
  432. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/conf/internal.h +0 -0
  433. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-aarch64-fuchsia.c +0 -0
  434. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-aarch64-linux.c +0 -0
  435. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-arm-linux.c +0 -1
  436. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-arm-linux.h +0 -0
  437. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-arm.c +0 -0
  438. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-intel.c +0 -0
  439. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-ppc64le.c +0 -0
  440. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/crypto.c +0 -0
  441. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/curve25519/spake25519.c +0 -0
  442. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/dh/check.c +3 -3
  443. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/dh/dh.c +1 -2
  444. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/dh/dh_asn1.c +0 -0
  445. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/dh/params.c +0 -0
  446. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/digest_extra/digest_extra.c +0 -0
  447. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/dsa/dsa.c +0 -0
  448. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/dsa/dsa_asn1.c +0 -0
  449. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/ec_extra/ec_asn1.c +0 -0
  450. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/ec_extra/ec_derive.c +2 -3
  451. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/ecdh_extra/ecdh_extra.c +0 -0
  452. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/ecdsa_extra/ecdsa_asn1.c +0 -0
  453. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/engine/engine.c +0 -0
  454. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/err/err.c +6 -6
  455. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/err/internal.h +0 -0
  456. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/digestsign.c +0 -0
  457. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/evp.c +0 -0
  458. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/evp_asn1.c +0 -0
  459. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/evp_ctx.c +0 -0
  460. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/internal.h +0 -0
  461. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_dsa_asn1.c +0 -0
  462. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_ec.c +0 -1
  463. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_ec_asn1.c +0 -0
  464. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_ed25519.c +0 -0
  465. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_ed25519_asn1.c +0 -0
  466. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_rsa.c +14 -2
  467. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_rsa_asn1.c +0 -0
  468. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_x25519.c +0 -0
  469. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_x25519_asn1.c +1 -2
  470. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/pbkdf.c +0 -0
  471. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/print.c +0 -0
  472. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/scrypt.c +0 -0
  473. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/sign.c +0 -0
  474. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/ex_data.c +0 -0
  475. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes.c +108 -0
  476. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c +1282 -0
  477. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/aes/internal.h +5 -7
  478. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/aes/key_wrap.c +0 -0
  479. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/aes/mode_wrappers.c +0 -2
  480. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bcm.c +2 -0
  481. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/add.c +0 -0
  482. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/asm/x86_64-gcc.c +0 -0
  483. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/bn.c +0 -0
  484. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/bytes.c +0 -0
  485. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/cmp.c +0 -0
  486. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/ctx.c +0 -0
  487. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/div.c +0 -0
  488. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/div_extra.c +0 -0
  489. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/exponentiation.c +0 -0
  490. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/gcd.c +0 -0
  491. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/gcd_extra.c +0 -0
  492. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/generic.c +0 -0
  493. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/internal.h +0 -0
  494. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/jacobi.c +0 -0
  495. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/montgomery.c +0 -0
  496. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/montgomery_inv.c +0 -0
  497. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/mul.c +0 -0
  498. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/prime.c +11 -12
  499. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/random.c +0 -0
  500. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/rsaz_exp.c +0 -0
  501. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/rsaz_exp.h +0 -0
  502. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/shift.c +0 -0
  503. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/sqrt.c +0 -0
  504. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/cipher/aead.c +0 -0
  505. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/cipher/cipher.c +0 -0
  506. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/cipher/e_aes.c +3 -5
  507. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/cipher/e_des.c +0 -0
  508. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/cipher/internal.h +0 -0
  509. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/delocate.h +0 -0
  510. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/des/des.c +0 -0
  511. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/des/internal.h +0 -0
  512. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/digest/digest.c +0 -0
  513. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/digest/digests.c +0 -0
  514. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/digest/internal.h +0 -0
  515. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/digest/md32_common.h +0 -0
  516. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/ec.c +0 -0
  517. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/ec_key.c +1 -1
  518. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/ec_montgomery.c +0 -0
  519. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/felem.c +0 -0
  520. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/internal.h +0 -0
  521. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/oct.c +0 -0
  522. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/p224-64.c +0 -0
  523. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/p256-x86_64-table.h +0 -0
  524. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/p256-x86_64.c +0 -0
  525. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/p256-x86_64.h +0 -0
  526. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/scalar.c +0 -0
  527. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/simple.c +0 -0
  528. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/simple_mul.c +0 -0
  529. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/util.c +0 -0
  530. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/wnaf.c +0 -0
  531. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ecdh/ecdh.c +0 -0
  532. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ecdsa/ecdsa.c +0 -0
  533. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/fips_shared_support.c +0 -0
  534. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/hmac/hmac.c +0 -0
  535. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/is_fips.c +0 -0
  536. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/md4/md4.c +0 -0
  537. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/md5/internal.h +0 -0
  538. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/md5/md5.c +0 -0
  539. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/cbc.c +0 -0
  540. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/cfb.c +0 -0
  541. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/ctr.c +0 -0
  542. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/gcm.c +45 -193
  543. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +304 -0
  544. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/internal.h +8 -18
  545. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/ofb.c +0 -0
  546. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/polyval.c +0 -0
  547. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rand/ctrdrbg.c +0 -0
  548. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rand/internal.h +0 -0
  549. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rand/rand.c +0 -0
  550. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rand/urandom.c +0 -0
  551. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rsa/blinding.c +0 -0
  552. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rsa/internal.h +0 -0
  553. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rsa/padding.c +0 -0
  554. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rsa/rsa.c +7 -1
  555. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rsa/rsa_impl.c +60 -51
  556. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/self_check/self_check.c +0 -0
  557. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/sha/internal.h +0 -0
  558. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/sha/sha1-altivec.c +0 -0
  559. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/sha/sha1.c +0 -0
  560. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/sha/sha256.c +0 -0
  561. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/sha/sha512.c +0 -0
  562. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/tls/internal.h +0 -0
  563. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/tls/kdf.c +0 -0
  564. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/hkdf/hkdf.c +0 -0
  565. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/hrss/hrss.c +210 -311
  566. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/hrss/internal.h +0 -1
  567. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/internal.h +21 -1
  568. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/lhash/lhash.c +0 -0
  569. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/mem.c +70 -0
  570. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/obj/obj.c +16 -21
  571. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/obj/obj_dat.h +27 -6
  572. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/obj/obj_xref.c +0 -0
  573. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_all.c +0 -0
  574. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_info.c +0 -1
  575. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_lib.c +7 -7
  576. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_oth.c +0 -1
  577. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_pk8.c +0 -1
  578. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_pkey.c +0 -1
  579. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_x509.c +0 -0
  580. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_xaux.c +0 -0
  581. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs7/internal.h +0 -0
  582. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs7/pkcs7.c +0 -0
  583. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs7/pkcs7_x509.c +1 -1
  584. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs8/internal.h +0 -0
  585. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs8/p5_pbev2.c +0 -0
  586. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs8/pkcs8.c +0 -0
  587. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs8/pkcs8_x509.c +0 -0
  588. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/poly1305/internal.h +0 -0
  589. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/poly1305/poly1305.c +2 -2
  590. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/poly1305/poly1305_arm.c +21 -20
  591. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/poly1305/poly1305_vec.c +34 -17
  592. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pool/internal.h +0 -0
  593. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pool/pool.c +1 -2
  594. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rand_extra/deterministic.c +0 -0
  595. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rand_extra/forkunsafe.c +0 -0
  596. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rand_extra/fuchsia.c +0 -0
  597. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rand_extra/rand_extra.c +0 -0
  598. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rand_extra/windows.c +0 -0
  599. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rc4/rc4.c +0 -0
  600. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/refcount_c11.c +0 -0
  601. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/refcount_lock.c +0 -0
  602. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rsa_extra/rsa_asn1.c +0 -0
  603. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rsa_extra/rsa_print.c +0 -0
  604. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/siphash/siphash.c +3 -1
  605. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/stack/stack.c +0 -0
  606. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/thread.c +0 -0
  607. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/thread_none.c +0 -0
  608. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/thread_pthread.c +0 -0
  609. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/thread_win.c +0 -0
  610. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/a_digest.c +0 -0
  611. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/a_sign.c +0 -0
  612. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/a_strex.c +0 -0
  613. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/a_verify.c +0 -1
  614. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/algorithm.c +0 -0
  615. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/asn1_gen.c +0 -0
  616. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/by_dir.c +1 -1
  617. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/by_file.c +0 -1
  618. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/charmap.h +0 -0
  619. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/i2d_pr.c +0 -0
  620. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/internal.h +0 -0
  621. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/rsa_pss.c +0 -0
  622. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/t_crl.c +0 -0
  623. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/t_req.c +0 -0
  624. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/t_x509.c +0 -0
  625. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/t_x509a.c +0 -0
  626. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/vpm_int.h +0 -0
  627. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509.c +0 -0
  628. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_att.c +0 -0
  629. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_cmp.c +0 -1
  630. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_d2.c +0 -0
  631. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_def.c +0 -0
  632. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_ext.c +0 -0
  633. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_lu.c +0 -0
  634. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_obj.c +1 -1
  635. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_r2x.c +0 -1
  636. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_req.c +0 -1
  637. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_set.c +0 -0
  638. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_trs.c +1 -2
  639. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_txt.c +0 -0
  640. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_v3.c +0 -0
  641. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_vfy.c +0 -1
  642. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_vpm.c +3 -4
  643. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509cset.c +0 -0
  644. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509name.c +0 -0
  645. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509rset.c +0 -0
  646. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509spki.c +0 -0
  647. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_algor.c +0 -0
  648. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_all.c +0 -1
  649. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_attrib.c +0 -0
  650. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_crl.c +0 -0
  651. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_exten.c +0 -0
  652. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_info.c +0 -0
  653. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_name.c +0 -0
  654. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_pkey.c +0 -0
  655. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_pubkey.c +0 -0
  656. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_req.c +0 -0
  657. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_sig.c +0 -0
  658. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_spki.c +0 -0
  659. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_val.c +0 -0
  660. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_x509.c +0 -0
  661. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_x509a.c +0 -0
  662. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/ext_dat.h +0 -0
  663. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/internal.h +0 -0
  664. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_cache.c +0 -0
  665. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_data.c +0 -0
  666. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_int.h +0 -0
  667. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_lib.c +0 -0
  668. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_map.c +0 -0
  669. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_node.c +0 -0
  670. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_tree.c +0 -0
  671. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_akey.c +0 -0
  672. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_akeya.c +0 -0
  673. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_alt.c +3 -3
  674. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_bcons.c +0 -0
  675. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_bitst.c +0 -0
  676. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_conf.c +0 -0
  677. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_cpols.c +0 -0
  678. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_crld.c +0 -0
  679. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_enum.c +2 -2
  680. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_extku.c +0 -0
  681. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_genn.c +0 -0
  682. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_ia5.c +0 -0
  683. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_info.c +4 -5
  684. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_int.c +0 -0
  685. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_lib.c +0 -0
  686. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_ncons.c +0 -0
  687. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_ocsp.c +0 -0
  688. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pci.c +0 -0
  689. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pcia.c +0 -0
  690. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pcons.c +0 -0
  691. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pku.c +0 -0
  692. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pmaps.c +0 -0
  693. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_prn.c +0 -0
  694. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_purp.c +2 -3
  695. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_skey.c +0 -0
  696. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_sxnet.c +0 -0
  697. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_utl.c +11 -12
  698. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/aead.h +0 -0
  699. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/aes.h +0 -0
  700. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/arm_arch.h +0 -0
  701. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/asn1.h +0 -0
  702. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/asn1_mac.h +0 -0
  703. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/asn1t.h +0 -0
  704. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/base.h +0 -0
  705. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/base64.h +0 -0
  706. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/bio.h +0 -0
  707. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/blowfish.h +0 -0
  708. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/bn.h +32 -20
  709. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/buf.h +9 -9
  710. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/buffer.h +0 -0
  711. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/bytestring.h +34 -0
  712. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/cast.h +0 -0
  713. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/chacha.h +0 -0
  714. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/cipher.h +0 -0
  715. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/cmac.h +0 -0
  716. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/conf.h +0 -0
  717. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/cpu.h +0 -0
  718. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/crypto.h +0 -0
  719. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/curve25519.h +0 -0
  720. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/des.h +0 -0
  721. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/dh.h +0 -0
  722. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/digest.h +0 -0
  723. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/dsa.h +0 -0
  724. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/dtls1.h +0 -0
  725. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/e_os2.h +0 -0
  726. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ec.h +11 -4
  727. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ec_key.h +4 -2
  728. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ecdh.h +0 -0
  729. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ecdsa.h +0 -0
  730. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/engine.h +0 -0
  731. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/err.h +11 -9
  732. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/evp.h +20 -0
  733. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ex_data.h +0 -0
  734. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/hkdf.h +0 -0
  735. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/hmac.h +0 -0
  736. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/hrss.h +0 -0
  737. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/is_boringssl.h +0 -0
  738. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/lhash.h +0 -0
  739. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/md4.h +0 -0
  740. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/md5.h +0 -0
  741. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/mem.h +17 -2
  742. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/nid.h +9 -0
  743. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/obj.h +0 -0
  744. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/obj_mac.h +0 -0
  745. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/objects.h +0 -0
  746. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/opensslconf.h +0 -0
  747. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/opensslv.h +0 -0
  748. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ossl_typ.h +0 -0
  749. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/pem.h +0 -0
  750. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/pkcs12.h +0 -0
  751. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/pkcs7.h +0 -0
  752. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/pkcs8.h +0 -0
  753. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/poly1305.h +5 -7
  754. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/pool.h +0 -0
  755. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/rand.h +0 -0
  756. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/rc4.h +0 -0
  757. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ripemd.h +0 -0
  758. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/rsa.h +0 -0
  759. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/safestack.h +0 -0
  760. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/sha.h +0 -0
  761. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/siphash.h +0 -0
  762. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/span.h +0 -0
  763. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/srtp.h +0 -0
  764. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ssl.h +10 -20
  765. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ssl3.h +0 -0
  766. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/stack.h +0 -0
  767. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/thread.h +0 -0
  768. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/tls1.h +0 -3
  769. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/type_check.h +0 -0
  770. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/x509.h +0 -0
  771. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/x509_vfy.h +0 -0
  772. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/x509v3.h +0 -0
  773. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/bio_ssl.cc +0 -0
  774. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/d1_both.cc +0 -1
  775. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/d1_lib.cc +0 -0
  776. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/d1_pkt.cc +0 -1
  777. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/d1_srtp.cc +0 -0
  778. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/dtls_method.cc +0 -1
  779. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/dtls_record.cc +0 -0
  780. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/handoff.cc +126 -29
  781. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/handshake.cc +5 -4
  782. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/handshake_client.cc +24 -13
  783. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/handshake_server.cc +1 -5
  784. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/internal.h +32 -26
  785. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/s3_both.cc +0 -0
  786. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/s3_lib.cc +2 -3
  787. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/s3_pkt.cc +0 -1
  788. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_aead_ctx.cc +0 -0
  789. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_asn1.cc +1 -2
  790. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_buffer.cc +34 -15
  791. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_cert.cc +0 -1
  792. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_cipher.cc +0 -1
  793. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_file.cc +0 -0
  794. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_key_share.cc +0 -0
  795. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_lib.cc +13 -14
  796. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_privkey.cc +0 -0
  797. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_session.cc +2 -1
  798. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_stat.cc +0 -0
  799. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_transcript.cc +0 -0
  800. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_versions.cc +1 -1
  801. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_x509.cc +0 -0
  802. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/t1_enc.cc +0 -0
  803. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/t1_lib.cc +11 -171
  804. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/tls13_both.cc +0 -0
  805. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/tls13_client.cc +3 -4
  806. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/tls13_enc.cc +5 -1
  807. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/tls13_server.cc +78 -101
  808. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/tls_method.cc +1 -1
  809. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/tls_record.cc +7 -2
  810. data/third_party/{boringssl → boringssl-with-bazel/src}/third_party/fiat/curve25519.c +0 -0
  811. data/third_party/{boringssl → boringssl-with-bazel/src}/third_party/fiat/curve25519_32.h +0 -0
  812. data/third_party/{boringssl → boringssl-with-bazel/src}/third_party/fiat/curve25519_64.h +0 -0
  813. data/third_party/{boringssl → boringssl-with-bazel/src}/third_party/fiat/curve25519_tables.h +0 -0
  814. data/third_party/{boringssl → boringssl-with-bazel/src}/third_party/fiat/internal.h +0 -0
  815. data/third_party/{boringssl → boringssl-with-bazel/src}/third_party/fiat/p256.c +0 -0
  816. data/third_party/{boringssl → boringssl-with-bazel/src}/third_party/fiat/p256_32.h +0 -0
  817. data/third_party/{boringssl → boringssl-with-bazel/src}/third_party/fiat/p256_64.h +0 -0
  818. data/third_party/upb/upb/decode.c +4 -0
  819. data/third_party/upb/upb/port.c +0 -1
  820. data/third_party/upb/upb/port_def.inc +1 -3
  821. data/third_party/upb/upb/table.c +2 -1
  822. metadata +680 -505
  823. data/src/core/lib/iomgr/logical_thread.cc +0 -103
  824. data/src/core/lib/iomgr/logical_thread.h +0 -52
  825. data/src/core/lib/json/json.cc +0 -94
  826. data/src/core/lib/json/json_reader.h +0 -146
  827. data/src/core/lib/json/json_string.cc +0 -367
  828. data/src/core/lib/json/json_writer.h +0 -84
  829. data/third_party/boringssl/crypto/fipsmodule/aes/aes.c +0 -860
@@ -321,13 +321,13 @@ void RoundRobin::RoundRobinSubchannelList::
321
321
  */
322
322
  if (num_ready_ > 0) {
323
323
  /* 1) READY */
324
- p->channel_control_helper()->UpdateState(GRPC_CHANNEL_READY,
325
- MakeUnique<Picker>(p, this));
324
+ p->channel_control_helper()->UpdateState(
325
+ GRPC_CHANNEL_READY, absl::make_unique<Picker>(p, this));
326
326
  } else if (num_connecting_ > 0) {
327
327
  /* 2) CONNECTING */
328
328
  p->channel_control_helper()->UpdateState(
329
329
  GRPC_CHANNEL_CONNECTING,
330
- MakeUnique<QueuePicker>(p->Ref(DEBUG_LOCATION, "QueuePicker")));
330
+ absl::make_unique<QueuePicker>(p->Ref(DEBUG_LOCATION, "QueuePicker")));
331
331
  } else if (num_transient_failure_ == num_subchannels()) {
332
332
  /* 3) TRANSIENT_FAILURE */
333
333
  grpc_error* error =
@@ -336,7 +336,7 @@ void RoundRobin::RoundRobinSubchannelList::
336
336
  GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
337
337
  p->channel_control_helper()->UpdateState(
338
338
  GRPC_CHANNEL_TRANSIENT_FAILURE,
339
- MakeUnique<TransientFailurePicker>(error));
339
+ absl::make_unique<TransientFailurePicker>(error));
340
340
  }
341
341
  }
342
342
 
@@ -453,7 +453,7 @@ void RoundRobin::UpdateLocked(UpdateArgs args) {
453
453
  GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
454
454
  channel_control_helper()->UpdateState(
455
455
  GRPC_CHANNEL_TRANSIENT_FAILURE,
456
- MakeUnique<TransientFailurePicker>(error));
456
+ absl::make_unique<TransientFailurePicker>(error));
457
457
  subchannel_list_ = std::move(latest_pending_subchannel_list_);
458
458
  } else if (subchannel_list_ == nullptr) {
459
459
  // If there is no current list, immediately promote the new list to
@@ -467,7 +467,7 @@ void RoundRobin::UpdateLocked(UpdateArgs args) {
467
467
  }
468
468
  }
469
469
 
470
- class ParsedRoundRobinConfig : public LoadBalancingPolicy::Config {
470
+ class RoundRobinConfig : public LoadBalancingPolicy::Config {
471
471
  public:
472
472
  const char* name() const override { return kRoundRobin; }
473
473
  };
@@ -486,12 +486,8 @@ class RoundRobinFactory : public LoadBalancingPolicyFactory {
486
486
  const char* name() const override { return kRoundRobin; }
487
487
 
488
488
  RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
489
- const grpc_json* json, grpc_error** /*error*/) const override {
490
- if (json != nullptr) {
491
- GPR_DEBUG_ASSERT(strcmp(json->key, name()) == 0);
492
- }
493
- return RefCountedPtr<LoadBalancingPolicy::Config>(
494
- new ParsedRoundRobinConfig());
489
+ const Json& /*json*/, grpc_error** /*error*/) const override {
490
+ return MakeRefCounted<RoundRobinConfig>();
495
491
  }
496
492
  };
497
493
 
@@ -502,7 +498,7 @@ class RoundRobinFactory : public LoadBalancingPolicyFactory {
502
498
  void grpc_lb_policy_round_robin_init() {
503
499
  grpc_core::LoadBalancingPolicyRegistry::Builder::
504
500
  RegisterLoadBalancingPolicyFactory(
505
- grpc_core::MakeUnique<grpc_core::RoundRobinFactory>());
501
+ absl::make_unique<grpc_core::RoundRobinFactory>());
506
502
  }
507
503
 
508
504
  void grpc_lb_policy_round_robin_shutdown() {}
@@ -36,16 +36,15 @@ namespace {
36
36
 
37
37
  constexpr char kCds[] = "cds_experimental";
38
38
 
39
- // Parsed config for this LB policy.
40
- class ParsedCdsConfig : public LoadBalancingPolicy::Config {
39
+ // Config for this LB policy.
40
+ class CdsConfig : public LoadBalancingPolicy::Config {
41
41
  public:
42
- explicit ParsedCdsConfig(grpc_core::UniquePtr<char> cluster)
43
- : cluster_(std::move(cluster)) {}
44
- const char* cluster() const { return cluster_.get(); }
42
+ explicit CdsConfig(std::string cluster) : cluster_(std::move(cluster)) {}
43
+ const std::string& cluster() const { return cluster_; }
45
44
  const char* name() const override { return kCds; }
46
45
 
47
46
  private:
48
- grpc_core::UniquePtr<char> cluster_;
47
+ std::string cluster_;
49
48
  };
50
49
 
51
50
  // CDS LB policy.
@@ -64,7 +63,7 @@ class CdsLb : public LoadBalancingPolicy {
64
63
  public:
65
64
  explicit ClusterWatcher(RefCountedPtr<CdsLb> parent)
66
65
  : parent_(std::move(parent)) {}
67
- void OnClusterChanged(CdsUpdate cluster_data) override;
66
+ void OnClusterChanged(XdsApi::CdsUpdate cluster_data) override;
68
67
  void OnError(grpc_error* error) override;
69
68
 
70
69
  private:
@@ -90,7 +89,7 @@ class CdsLb : public LoadBalancingPolicy {
90
89
 
91
90
  void ShutdownLocked() override;
92
91
 
93
- RefCountedPtr<ParsedCdsConfig> config_;
92
+ RefCountedPtr<CdsConfig> config_;
94
93
 
95
94
  // Current channel args from the resolver.
96
95
  const grpc_channel_args* args_ = nullptr;
@@ -112,47 +111,40 @@ class CdsLb : public LoadBalancingPolicy {
112
111
  // CdsLb::ClusterWatcher
113
112
  //
114
113
 
115
- void CdsLb::ClusterWatcher::OnClusterChanged(CdsUpdate cluster_data) {
114
+ void CdsLb::ClusterWatcher::OnClusterChanged(XdsApi::CdsUpdate cluster_data) {
116
115
  if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
117
- gpr_log(GPR_INFO, "[cdslb %p] received CDS update from xds client",
118
- parent_.get());
116
+ gpr_log(GPR_INFO,
117
+ "[cdslb %p] received CDS update from xds client %p: "
118
+ "eds_service_name=%s lrs_load_reporting_server_name=%s",
119
+ parent_.get(), parent_->xds_client_.get(),
120
+ cluster_data.eds_service_name.c_str(),
121
+ cluster_data.lrs_load_reporting_server_name.has_value()
122
+ ? cluster_data.lrs_load_reporting_server_name.value().c_str()
123
+ : "(unset)");
119
124
  }
120
125
  // Construct config for child policy.
121
- char* lrs_str = nullptr;
122
- if (cluster_data.lrs_load_reporting_server_name != nullptr) {
123
- gpr_asprintf(&lrs_str, " \"lrsLoadReportingServerName\": \"%s\",\n",
124
- cluster_data.lrs_load_reporting_server_name.get());
126
+ Json::Object child_config = {
127
+ {"edsServiceName",
128
+ (cluster_data.eds_service_name.empty() ? parent_->config_->cluster()
129
+ : cluster_data.eds_service_name)},
130
+ };
131
+ if (cluster_data.lrs_load_reporting_server_name.has_value()) {
132
+ child_config["lrsLoadReportingServerName"] =
133
+ cluster_data.lrs_load_reporting_server_name.value();
125
134
  }
126
- char* json_str;
127
- gpr_asprintf(&json_str,
128
- "[{\n"
129
- " \"xds_experimental\": {\n"
130
- "%s"
131
- " \"edsServiceName\": \"%s\"\n"
132
- " }\n"
133
- "}]",
134
- (lrs_str == nullptr ? "" : lrs_str),
135
- (cluster_data.eds_service_name == nullptr
136
- ? parent_->config_->cluster()
137
- : cluster_data.eds_service_name.get()));
138
- gpr_free(lrs_str);
139
- grpc_core::UniquePtr<char> json_str_deleter(json_str);
135
+ Json json = Json::Array{
136
+ Json::Object{
137
+ {"xds_experimental", std::move(child_config)},
138
+ },
139
+ };
140
140
  if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
141
+ std::string json_str = json.Dump();
141
142
  gpr_log(GPR_INFO, "[cdslb %p] generated config for child policy: %s",
142
- parent_.get(), json_str);
143
- }
144
- grpc_json* json = grpc_json_parse_string(json_str);
145
- if (json == nullptr) {
146
- char* msg;
147
- gpr_asprintf(&msg, "Could not parse LB config: %s", json_str);
148
- OnError(GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg));
149
- gpr_free(msg);
150
- return;
143
+ parent_.get(), json_str.c_str());
151
144
  }
152
145
  grpc_error* error = GRPC_ERROR_NONE;
153
146
  RefCountedPtr<LoadBalancingPolicy::Config> config =
154
147
  LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(json, &error);
155
- grpc_json_destroy(json);
156
148
  if (error != GRPC_ERROR_NONE) {
157
149
  OnError(error);
158
150
  return;
@@ -162,13 +154,22 @@ void CdsLb::ClusterWatcher::OnClusterChanged(CdsUpdate cluster_data) {
162
154
  LoadBalancingPolicy::Args args;
163
155
  args.combiner = parent_->combiner();
164
156
  args.args = parent_->args_;
165
- args.channel_control_helper = MakeUnique<Helper>(parent_->Ref());
157
+ args.channel_control_helper = absl::make_unique<Helper>(parent_->Ref());
166
158
  parent_->child_policy_ =
167
159
  LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy(
168
160
  "xds_experimental", std::move(args));
161
+ if (parent_->child_policy_ == nullptr) {
162
+ OnError(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
163
+ "failed to create xds_experimental child policy"));
164
+ return;
165
+ }
169
166
  grpc_pollset_set_add_pollset_set(
170
167
  parent_->child_policy_->interested_parties(),
171
168
  parent_->interested_parties());
169
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
170
+ gpr_log(GPR_INFO, "[cdslb %p] created child policy xds_experimental (%p)",
171
+ parent_.get(), parent_->child_policy_.get());
172
+ }
172
173
  }
173
174
  // Update child policy.
174
175
  UpdateArgs args;
@@ -179,14 +180,15 @@ void CdsLb::ClusterWatcher::OnClusterChanged(CdsUpdate cluster_data) {
179
180
 
180
181
  void CdsLb::ClusterWatcher::OnError(grpc_error* error) {
181
182
  gpr_log(GPR_ERROR, "[cdslb %p] xds error obtaining data for cluster %s: %s",
182
- parent_.get(), parent_->config_->cluster(), grpc_error_string(error));
183
+ parent_.get(), parent_->config_->cluster().c_str(),
184
+ grpc_error_string(error));
183
185
  // Go into TRANSIENT_FAILURE if we have not yet created the child
184
186
  // policy (i.e., we have not yet received data from xds). Otherwise,
185
187
  // we keep running with the data we had previously.
186
188
  if (parent_->child_policy_ == nullptr) {
187
189
  parent_->channel_control_helper()->UpdateState(
188
190
  GRPC_CHANNEL_TRANSIENT_FAILURE,
189
- MakeUnique<TransientFailurePicker>(error));
191
+ absl::make_unique<TransientFailurePicker>(error));
190
192
  } else {
191
193
  GRPC_ERROR_UNREF(error);
192
194
  }
@@ -233,9 +235,9 @@ void CdsLb::Helper::AddTraceEvent(TraceSeverity severity, StringView message) {
233
235
  CdsLb::CdsLb(Args args)
234
236
  : LoadBalancingPolicy(std::move(args)),
235
237
  xds_client_(XdsClient::GetFromChannelArgs(*args.args)) {
236
- if (xds_client_ != nullptr && GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
237
- gpr_log(GPR_INFO, "[cdslb %p] Using xds client %p from channel", this,
238
- xds_client_.get());
238
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
239
+ gpr_log(GPR_INFO, "[cdslb %p] created -- using xds client %p from channel",
240
+ this, xds_client_.get());
239
241
  }
240
242
  }
241
243
 
@@ -258,8 +260,12 @@ void CdsLb::ShutdownLocked() {
258
260
  }
259
261
  if (xds_client_ != nullptr) {
260
262
  if (cluster_watcher_ != nullptr) {
261
- xds_client_->CancelClusterDataWatch(StringView(config_->cluster()),
262
- cluster_watcher_);
263
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
264
+ gpr_log(GPR_INFO, "[cdslb %p] cancelling watch for cluster %s", this,
265
+ config_->cluster().c_str());
266
+ }
267
+ xds_client_->CancelClusterDataWatch(
268
+ StringView(config_->cluster().c_str()), cluster_watcher_);
263
269
  }
264
270
  xds_client_.reset();
265
271
  }
@@ -270,26 +276,35 @@ void CdsLb::ResetBackoffLocked() {
270
276
  }
271
277
 
272
278
  void CdsLb::UpdateLocked(UpdateArgs args) {
273
- if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
274
- gpr_log(GPR_INFO, "[cdslb %p] received update", this);
275
- }
276
279
  // Update config.
277
280
  auto old_config = std::move(config_);
278
281
  config_ = std::move(args.config);
282
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
283
+ gpr_log(GPR_INFO, "[cdslb %p] received update: cluster=%s", this,
284
+ config_->cluster().c_str());
285
+ }
279
286
  // Update args.
280
287
  grpc_channel_args_destroy(args_);
281
288
  args_ = args.args;
282
289
  args.args = nullptr;
283
290
  // If cluster name changed, cancel watcher and restart.
284
- if (old_config == nullptr ||
285
- strcmp(old_config->cluster(), config_->cluster()) != 0) {
291
+ if (old_config == nullptr || old_config->cluster() != config_->cluster()) {
286
292
  if (old_config != nullptr) {
287
- xds_client_->CancelClusterDataWatch(StringView(old_config->cluster()),
288
- cluster_watcher_);
293
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
294
+ gpr_log(GPR_INFO, "[cdslb %p] cancelling watch for cluster %s", this,
295
+ old_config->cluster().c_str());
296
+ }
297
+ xds_client_->CancelClusterDataWatch(
298
+ StringView(old_config->cluster().c_str()), cluster_watcher_,
299
+ /*delay_unsubscription=*/true);
300
+ }
301
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
302
+ gpr_log(GPR_INFO, "[cdslb %p] starting watch for cluster %s", this,
303
+ config_->cluster().c_str());
289
304
  }
290
- auto watcher = MakeUnique<ClusterWatcher>(Ref());
305
+ auto watcher = absl::make_unique<ClusterWatcher>(Ref());
291
306
  cluster_watcher_ = watcher.get();
292
- xds_client_->WatchClusterData(StringView(config_->cluster()),
307
+ xds_client_->WatchClusterData(StringView(config_->cluster().c_str()),
293
308
  std::move(watcher));
294
309
  }
295
310
  }
@@ -308,9 +323,9 @@ class CdsFactory : public LoadBalancingPolicyFactory {
308
323
  const char* name() const override { return kCds; }
309
324
 
310
325
  RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
311
- const grpc_json* json, grpc_error** error) const override {
326
+ const Json& json, grpc_error** error) const override {
312
327
  GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE);
313
- if (json == nullptr) {
328
+ if (json.type() == Json::Type::JSON_NULL) {
314
329
  // xds was mentioned as a policy in the deprecated loadBalancingPolicy
315
330
  // field or in the client API.
316
331
  *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
@@ -318,36 +333,23 @@ class CdsFactory : public LoadBalancingPolicyFactory {
318
333
  "Please use loadBalancingConfig field of service config instead.");
319
334
  return nullptr;
320
335
  }
321
- GPR_DEBUG_ASSERT(strcmp(json->key, name()) == 0);
322
- InlinedVector<grpc_error*, 3> error_list;
323
- const char* cluster = nullptr;
324
- for (const grpc_json* field = json->child; field != nullptr;
325
- field = field->next) {
326
- if (field->key == nullptr) continue;
327
- if (strcmp(field->key, "cluster") == 0) {
328
- if (cluster != nullptr) {
329
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
330
- "field:cluster error:Duplicate entry"));
331
- }
332
- if (field->type != GRPC_JSON_STRING) {
333
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
334
- "field:cluster error:type should be string"));
335
- continue;
336
- }
337
- cluster = field->value;
338
- }
339
- }
340
- if (cluster == nullptr) {
336
+ std::vector<grpc_error*> error_list;
337
+ std::string cluster;
338
+ auto it = json.object_value().find("cluster");
339
+ if (it == json.object_value().end()) {
341
340
  error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
342
341
  "required field 'cluster' not present"));
343
- }
344
- if (error_list.empty()) {
345
- return MakeRefCounted<ParsedCdsConfig>(
346
- grpc_core::UniquePtr<char>(gpr_strdup(cluster)));
342
+ } else if (it->second.type() != Json::Type::STRING) {
343
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
344
+ "field:cluster error:type should be string"));
347
345
  } else {
346
+ cluster = it->second.string_value();
347
+ }
348
+ if (!error_list.empty()) {
348
349
  *error = GRPC_ERROR_CREATE_FROM_VECTOR("Cds Parser", &error_list);
349
350
  return nullptr;
350
351
  }
352
+ return MakeRefCounted<CdsConfig>(std::move(cluster));
351
353
  }
352
354
  };
353
355
 
@@ -362,7 +364,7 @@ class CdsFactory : public LoadBalancingPolicyFactory {
362
364
  void grpc_lb_policy_cds_init() {
363
365
  grpc_core::LoadBalancingPolicyRegistry::Builder::
364
366
  RegisterLoadBalancingPolicyFactory(
365
- grpc_core::MakeUnique<grpc_core::CdsFactory>());
367
+ absl::make_unique<grpc_core::CdsFactory>());
366
368
  }
367
369
 
368
370
  void grpc_lb_policy_cds_shutdown() {}
@@ -25,6 +25,8 @@
25
25
  #include <limits.h>
26
26
  #include <string.h>
27
27
 
28
+ #include "absl/types/optional.h"
29
+
28
30
  #include <grpc/grpc.h>
29
31
  #include <grpc/support/alloc.h>
30
32
  #include <grpc/support/string_util.h>
@@ -32,6 +34,7 @@
32
34
 
33
35
  #include "src/core/ext/filters/client_channel/client_channel.h"
34
36
  #include "src/core/ext/filters/client_channel/lb_policy.h"
37
+ #include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h"
35
38
  #include "src/core/ext/filters/client_channel/lb_policy/xds/xds.h"
36
39
  #include "src/core/ext/filters/client_channel/lb_policy_factory.h"
37
40
  #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
@@ -68,18 +71,18 @@
68
71
 
69
72
  namespace grpc_core {
70
73
 
71
- TraceFlag grpc_lb_xds_trace(false, "xds");
74
+ TraceFlag grpc_lb_xds_trace(false, "xds_lb");
72
75
 
73
76
  namespace {
74
77
 
75
78
  constexpr char kXds[] = "xds_experimental";
76
79
 
77
- class ParsedXdsConfig : public LoadBalancingPolicy::Config {
80
+ class XdsConfig : public LoadBalancingPolicy::Config {
78
81
  public:
79
- ParsedXdsConfig(RefCountedPtr<LoadBalancingPolicy::Config> child_policy,
80
- RefCountedPtr<LoadBalancingPolicy::Config> fallback_policy,
81
- grpc_core::UniquePtr<char> eds_service_name,
82
- grpc_core::UniquePtr<char> lrs_load_reporting_server_name)
82
+ XdsConfig(RefCountedPtr<LoadBalancingPolicy::Config> child_policy,
83
+ RefCountedPtr<LoadBalancingPolicy::Config> fallback_policy,
84
+ std::string eds_service_name,
85
+ absl::optional<std::string> lrs_load_reporting_server_name)
83
86
  : child_policy_(std::move(child_policy)),
84
87
  fallback_policy_(std::move(fallback_policy)),
85
88
  eds_service_name_(std::move(eds_service_name)),
@@ -96,17 +99,19 @@ class ParsedXdsConfig : public LoadBalancingPolicy::Config {
96
99
  return fallback_policy_;
97
100
  }
98
101
 
99
- const char* eds_service_name() const { return eds_service_name_.get(); };
102
+ const char* eds_service_name() const {
103
+ return eds_service_name_.empty() ? nullptr : eds_service_name_.c_str();
104
+ };
100
105
 
101
- const char* lrs_load_reporting_server_name() const {
102
- return lrs_load_reporting_server_name_.get();
106
+ const absl::optional<std::string>& lrs_load_reporting_server_name() const {
107
+ return lrs_load_reporting_server_name_;
103
108
  };
104
109
 
105
110
  private:
106
111
  RefCountedPtr<LoadBalancingPolicy::Config> child_policy_;
107
112
  RefCountedPtr<LoadBalancingPolicy::Config> fallback_policy_;
108
- grpc_core::UniquePtr<char> eds_service_name_;
109
- grpc_core::UniquePtr<char> lrs_load_reporting_server_name_;
113
+ std::string eds_service_name_;
114
+ absl::optional<std::string> lrs_load_reporting_server_name_;
110
115
  };
111
116
 
112
117
  class XdsLb : public LoadBalancingPolicy {
@@ -121,31 +126,42 @@ class XdsLb : public LoadBalancingPolicy {
121
126
  private:
122
127
  class EndpointWatcher;
123
128
 
124
- // We need this wrapper for the following reasons:
125
- // 1. To process per-locality load reporting.
126
- // 2. Since pickers are std::unique_ptrs we use this RefCounted wrapper to
127
- // control
128
- // references to it by the xds picker and the locality.
129
- class EndpointPickerWrapper : public RefCounted<EndpointPickerWrapper> {
129
+ // A simple wrapper to convert the picker returned from a locality's child
130
+ // policy as a unique_ptr<> to a RefCountedPtr<>. This allows it to be
131
+ // referenced by both the picker and the locality.
132
+ class RefCountedEndpointPicker : public RefCounted<RefCountedEndpointPicker> {
133
+ public:
134
+ explicit RefCountedEndpointPicker(std::unique_ptr<SubchannelPicker> picker)
135
+ : picker_(std::move(picker)) {}
136
+ PickResult Pick(PickArgs args) { return picker_->Pick(std::move(args)); }
137
+
138
+ private:
139
+ std::unique_ptr<SubchannelPicker> picker_;
140
+ };
141
+
142
+ // A picker that wraps the RefCountedEndpointPicker and performs load
143
+ // reporting for the locality.
144
+ class LoadReportingPicker : public RefCounted<LoadReportingPicker> {
130
145
  public:
131
- EndpointPickerWrapper(
132
- std::unique_ptr<SubchannelPicker> picker,
133
- RefCountedPtr<XdsClientStats::LocalityStats> locality_stats)
146
+ LoadReportingPicker(RefCountedPtr<RefCountedEndpointPicker> picker,
147
+ RefCountedPtr<XdsClusterLocalityStats> locality_stats)
134
148
  : picker_(std::move(picker)),
135
- locality_stats_(std::move(locality_stats)) {
136
- locality_stats_->RefByPicker();
137
- }
138
- ~EndpointPickerWrapper() { locality_stats_->UnrefByPicker(); }
149
+ locality_stats_(std::move(locality_stats)) {}
139
150
 
140
151
  PickResult Pick(PickArgs args);
141
152
 
153
+ RefCountedEndpointPicker* picker() const { return picker_.get(); }
154
+ XdsClusterLocalityStats* locality_stats() const {
155
+ return locality_stats_.get();
156
+ }
157
+
142
158
  private:
143
- std::unique_ptr<SubchannelPicker> picker_;
144
- RefCountedPtr<XdsClientStats::LocalityStats> locality_stats_;
159
+ RefCountedPtr<RefCountedEndpointPicker> picker_;
160
+ RefCountedPtr<XdsClusterLocalityStats> locality_stats_;
145
161
  };
146
162
 
147
- // The picker will use a stateless weighting algorithm to pick the locality to
148
- // use for each request.
163
+ // A picker that uses a stateless weighting algorithm to pick the locality
164
+ // to use for each request.
149
165
  class LocalityPicker : public SubchannelPicker {
150
166
  public:
151
167
  // Maintains a weighted list of pickers from each locality that is in ready
@@ -153,12 +169,12 @@ class XdsLb : public LoadBalancingPolicy {
153
169
  // proportional to the locality's weight. The start of the range is the
154
170
  // previous value in the vector and is 0 for the first element.
155
171
  using PickerList =
156
- InlinedVector<std::pair<uint32_t, RefCountedPtr<EndpointPickerWrapper>>,
172
+ InlinedVector<std::pair<uint32_t, RefCountedPtr<LoadReportingPicker>>,
157
173
  1>;
158
- LocalityPicker(RefCountedPtr<XdsLb> xds_policy, PickerList pickers)
159
- : xds_policy_(std::move(xds_policy)),
160
- pickers_(std::move(pickers)),
161
- drop_config_(xds_policy_->drop_config_) {}
174
+ LocalityPicker(XdsLb* xds_policy, PickerList pickers)
175
+ : drop_stats_(xds_policy->drop_stats_),
176
+ drop_config_(xds_policy->drop_config_),
177
+ pickers_(std::move(pickers)) {}
162
178
 
163
179
  PickResult Pick(PickArgs args) override;
164
180
 
@@ -166,9 +182,9 @@ class XdsLb : public LoadBalancingPolicy {
166
182
  // Calls the picker of the locality that the key falls within.
167
183
  PickResult PickFromLocality(const uint32_t key, PickArgs args);
168
184
 
169
- RefCountedPtr<XdsLb> xds_policy_;
185
+ RefCountedPtr<XdsClusterDropStats> drop_stats_;
186
+ RefCountedPtr<XdsApi::DropConfig> drop_config_;
170
187
  PickerList pickers_;
171
- RefCountedPtr<XdsDropConfig> drop_config_;
172
188
  };
173
189
 
174
190
  class FallbackHelper : public ChannelControlHelper {
@@ -185,219 +201,171 @@ class XdsLb : public LoadBalancingPolicy {
185
201
  void RequestReresolution() override;
186
202
  void AddTraceEvent(TraceSeverity severity, StringView message) override;
187
203
 
188
- void set_child(LoadBalancingPolicy* child) { child_ = child; }
189
-
190
204
  private:
191
- bool CalledByPendingFallback() const;
192
- bool CalledByCurrentFallback() const;
193
-
194
205
  RefCountedPtr<XdsLb> parent_;
195
- LoadBalancingPolicy* child_ = nullptr;
196
206
  };
197
207
 
198
- // There is only one PriorityList instance, which has the same lifetime with
199
- // the XdsLb instance.
200
- class PriorityList {
208
+ // Each LocalityMap holds a ref to the XdsLb.
209
+ class LocalityMap : public InternallyRefCounted<LocalityMap> {
201
210
  public:
202
- // Each LocalityMap holds a ref to the XdsLb.
203
- class LocalityMap : public InternallyRefCounted<LocalityMap> {
211
+ // Each Locality holds a ref to the LocalityMap it is in.
212
+ class Locality : public InternallyRefCounted<Locality> {
204
213
  public:
205
- // Each Locality holds a ref to the LocalityMap it is in.
206
- class Locality : public InternallyRefCounted<Locality> {
207
- public:
208
- Locality(RefCountedPtr<LocalityMap> locality_map,
209
- RefCountedPtr<XdsLocalityName> name);
210
- ~Locality();
211
-
212
- void UpdateLocked(uint32_t locality_weight,
213
- ServerAddressList serverlist);
214
- void ShutdownLocked();
215
- void ResetBackoffLocked();
216
- void DeactivateLocked();
217
- void Orphan() override;
218
-
219
- grpc_connectivity_state connectivity_state() const {
220
- return connectivity_state_;
221
- }
222
- uint32_t weight() const { return weight_; }
223
- RefCountedPtr<EndpointPickerWrapper> picker_wrapper() const {
224
- return picker_wrapper_;
225
- }
226
-
227
- void set_locality_map(RefCountedPtr<LocalityMap> locality_map) {
228
- locality_map_ = std::move(locality_map);
229
- }
214
+ Locality(RefCountedPtr<LocalityMap> locality_map,
215
+ RefCountedPtr<XdsLocalityName> name);
216
+ ~Locality();
230
217
 
231
- private:
232
- class Helper : public ChannelControlHelper {
233
- public:
234
- explicit Helper(RefCountedPtr<Locality> locality)
235
- : locality_(std::move(locality)) {}
236
-
237
- ~Helper() { locality_.reset(DEBUG_LOCATION, "Helper"); }
238
-
239
- RefCountedPtr<SubchannelInterface> CreateSubchannel(
240
- const grpc_channel_args& args) override;
241
- void UpdateState(grpc_connectivity_state state,
242
- std::unique_ptr<SubchannelPicker> picker) override;
243
- // This is a no-op, because we get the addresses from the xds
244
- // client, which is a watch-based API.
245
- void RequestReresolution() override {}
246
- void AddTraceEvent(TraceSeverity severity,
247
- StringView message) override;
248
- void set_child(LoadBalancingPolicy* child) { child_ = child; }
249
-
250
- private:
251
- bool CalledByPendingChild() const;
252
- bool CalledByCurrentChild() const;
253
-
254
- RefCountedPtr<Locality> locality_;
255
- LoadBalancingPolicy* child_ = nullptr;
256
- };
257
-
258
- // Methods for dealing with the child policy.
259
- OrphanablePtr<LoadBalancingPolicy> CreateChildPolicyLocked(
260
- const char* name, const grpc_channel_args* args);
261
- grpc_channel_args* CreateChildPolicyArgsLocked(
262
- const grpc_channel_args* args);
263
-
264
- static void OnDelayedRemovalTimer(void* arg, grpc_error* error);
265
- static void OnDelayedRemovalTimerLocked(void* arg, grpc_error* error);
266
-
267
- XdsLb* xds_policy() const { return locality_map_->xds_policy(); }
268
-
269
- // The owning locality map.
270
- RefCountedPtr<LocalityMap> locality_map_;
271
-
272
- RefCountedPtr<XdsLocalityName> name_;
273
- OrphanablePtr<LoadBalancingPolicy> child_policy_;
274
- OrphanablePtr<LoadBalancingPolicy> pending_child_policy_;
275
- RefCountedPtr<EndpointPickerWrapper> picker_wrapper_;
276
- grpc_connectivity_state connectivity_state_ = GRPC_CHANNEL_IDLE;
277
- uint32_t weight_;
278
-
279
- // States for delayed removal.
280
- grpc_timer delayed_removal_timer_;
281
- grpc_closure on_delayed_removal_timer_;
282
- bool delayed_removal_timer_callback_pending_ = false;
283
- bool shutdown_ = false;
284
- };
285
-
286
- LocalityMap(RefCountedPtr<XdsLb> xds_policy, uint32_t priority);
287
-
288
- void UpdateLocked(
289
- const XdsPriorityListUpdate::LocalityMap& locality_map_update);
218
+ void UpdateLocked(uint32_t locality_weight, ServerAddressList serverlist,
219
+ bool update_locality_stats);
220
+ void ShutdownLocked();
290
221
  void ResetBackoffLocked();
291
- void UpdateXdsPickerLocked();
292
- OrphanablePtr<Locality> ExtractLocalityLocked(
293
- const RefCountedPtr<XdsLocalityName>& name);
294
222
  void DeactivateLocked();
295
- // Returns true if this locality map becomes the currently used one (i.e.,
296
- // its priority is selected) after reactivation.
297
- bool MaybeReactivateLocked();
298
- void MaybeCancelFailoverTimerLocked();
299
-
300
223
  void Orphan() override;
301
224
 
302
- XdsLb* xds_policy() const { return xds_policy_.get(); }
303
- uint32_t priority() const { return priority_; }
225
+ uint32_t weight() const { return weight_; }
226
+
304
227
  grpc_connectivity_state connectivity_state() const {
305
228
  return connectivity_state_;
306
229
  }
307
- bool failover_timer_callback_pending() const {
308
- return failover_timer_callback_pending_;
230
+
231
+ RefCountedPtr<LoadReportingPicker> GetLoadReportingPicker() {
232
+ // Recreate load reporting picker if stats object has changed.
233
+ if (load_reporting_picker_ == nullptr ||
234
+ load_reporting_picker_->picker() != picker_wrapper_.get() ||
235
+ load_reporting_picker_->locality_stats() != stats_.get()) {
236
+ load_reporting_picker_ =
237
+ MakeRefCounted<LoadReportingPicker>(picker_wrapper_, stats_);
238
+ }
239
+ return load_reporting_picker_;
240
+ }
241
+
242
+ void set_locality_map(RefCountedPtr<LocalityMap> locality_map) {
243
+ locality_map_ = std::move(locality_map);
309
244
  }
310
245
 
311
246
  private:
312
- void OnLocalityStateUpdateLocked();
313
- void UpdateConnectivityStateLocked();
247
+ class Helper : public ChannelControlHelper {
248
+ public:
249
+ explicit Helper(RefCountedPtr<Locality> locality)
250
+ : locality_(std::move(locality)) {}
251
+
252
+ ~Helper() { locality_.reset(DEBUG_LOCATION, "Helper"); }
253
+
254
+ RefCountedPtr<SubchannelInterface> CreateSubchannel(
255
+ const grpc_channel_args& args) override;
256
+ void UpdateState(grpc_connectivity_state state,
257
+ std::unique_ptr<SubchannelPicker> picker) override;
258
+ // This is a no-op, because we get the addresses from the xds
259
+ // client, which is a watch-based API.
260
+ void RequestReresolution() override {}
261
+ void AddTraceEvent(TraceSeverity severity, StringView message) override;
262
+
263
+ private:
264
+ RefCountedPtr<Locality> locality_;
265
+ };
266
+
267
+ // Methods for dealing with the child policy.
268
+ OrphanablePtr<LoadBalancingPolicy> CreateChildPolicyLocked(
269
+ const grpc_channel_args* args);
270
+ grpc_channel_args* CreateChildPolicyArgsLocked(
271
+ const grpc_channel_args* args);
272
+
273
+ void UpdateLocalityStats();
274
+
314
275
  static void OnDelayedRemovalTimer(void* arg, grpc_error* error);
315
- static void OnFailoverTimer(void* arg, grpc_error* error);
316
276
  static void OnDelayedRemovalTimerLocked(void* arg, grpc_error* error);
317
- static void OnFailoverTimerLocked(void* arg, grpc_error* error);
318
277
 
319
- PriorityList* priority_list() const {
320
- return &xds_policy_->priority_list_;
321
- }
322
- const XdsPriorityListUpdate& priority_list_update() const {
323
- return xds_policy_->priority_list_update_;
324
- }
325
- const XdsPriorityListUpdate::LocalityMap* locality_map_update() const {
326
- return xds_policy_->priority_list_update_.Find(priority_);
327
- }
278
+ XdsLb* xds_policy() const { return locality_map_->xds_policy(); }
328
279
 
329
- RefCountedPtr<XdsLb> xds_policy_;
280
+ // The owning locality map.
281
+ RefCountedPtr<LocalityMap> locality_map_;
330
282
 
331
- std::map<RefCountedPtr<XdsLocalityName>, OrphanablePtr<Locality>,
332
- XdsLocalityName::Less>
333
- localities_;
334
- const uint32_t priority_;
283
+ RefCountedPtr<XdsLocalityName> name_;
284
+ RefCountedPtr<XdsClusterLocalityStats> stats_;
285
+ OrphanablePtr<LoadBalancingPolicy> child_policy_;
286
+ RefCountedPtr<RefCountedEndpointPicker> picker_wrapper_;
287
+ RefCountedPtr<LoadReportingPicker> load_reporting_picker_;
335
288
  grpc_connectivity_state connectivity_state_ = GRPC_CHANNEL_IDLE;
289
+ uint32_t weight_;
336
290
 
337
291
  // States for delayed removal.
338
292
  grpc_timer delayed_removal_timer_;
339
293
  grpc_closure on_delayed_removal_timer_;
340
294
  bool delayed_removal_timer_callback_pending_ = false;
341
-
342
- // States of failover.
343
- grpc_timer failover_timer_;
344
- grpc_closure on_failover_timer_;
345
- bool failover_timer_callback_pending_ = false;
295
+ bool shutdown_ = false;
346
296
  };
347
297
 
348
- explicit PriorityList(XdsLb* xds_policy) : xds_policy_(xds_policy) {}
298
+ LocalityMap(RefCountedPtr<XdsLb> xds_policy, uint32_t priority);
349
299
 
350
- void UpdateLocked();
300
+ ~LocalityMap() { xds_policy_.reset(DEBUG_LOCATION, "LocalityMap"); }
301
+
302
+ void UpdateLocked(
303
+ const XdsApi::PriorityListUpdate::LocalityMap& priority_update,
304
+ bool update_locality_stats);
351
305
  void ResetBackoffLocked();
352
- void ShutdownLocked();
353
306
  void UpdateXdsPickerLocked();
354
-
355
- const XdsPriorityListUpdate& priority_list_update() const {
356
- return xds_policy_->priority_list_update_;
307
+ OrphanablePtr<Locality> ExtractLocalityLocked(
308
+ const RefCountedPtr<XdsLocalityName>& name);
309
+ void DeactivateLocked();
310
+ // Returns true if this locality map becomes the currently used one (i.e.,
311
+ // its priority is selected) after reactivation.
312
+ bool MaybeReactivateLocked();
313
+ void MaybeCancelFailoverTimerLocked();
314
+
315
+ void Orphan() override;
316
+
317
+ XdsLb* xds_policy() const { return xds_policy_.get(); }
318
+ uint32_t priority() const { return priority_; }
319
+ grpc_connectivity_state connectivity_state() const {
320
+ return connectivity_state_;
321
+ }
322
+ bool failover_timer_callback_pending() const {
323
+ return failover_timer_callback_pending_;
357
324
  }
358
- uint32_t current_priority() const { return current_priority_; }
359
325
 
360
326
  private:
361
- void MaybeCreateLocalityMapLocked(uint32_t priority);
362
- void FailoverOnConnectionFailureLocked();
363
- void FailoverOnDisconnectionLocked(uint32_t failed_priority);
364
- void SwitchToHigherPriorityLocked(uint32_t priority);
365
- void DeactivatePrioritiesLowerThan(uint32_t priority);
366
- OrphanablePtr<LocalityMap::Locality> ExtractLocalityLocked(
367
- const RefCountedPtr<XdsLocalityName>& name, uint32_t exclude_priority);
368
- // Callers should make sure the priority list is non-empty.
369
- uint32_t LowestPriority() const {
370
- return static_cast<uint32_t>(priorities_.size()) - 1;
327
+ void OnLocalityStateUpdateLocked();
328
+ void UpdateConnectivityStateLocked();
329
+ static void OnDelayedRemovalTimer(void* arg, grpc_error* error);
330
+ static void OnFailoverTimer(void* arg, grpc_error* error);
331
+ static void OnDelayedRemovalTimerLocked(void* arg, grpc_error* error);
332
+ static void OnFailoverTimerLocked(void* arg, grpc_error* error);
333
+
334
+ const XdsApi::PriorityListUpdate& priority_list_update() const {
335
+ return xds_policy_->priority_list_update_;
336
+ }
337
+ const XdsApi::PriorityListUpdate::LocalityMap* locality_map_update() const {
338
+ return xds_policy_->priority_list_update_.Find(priority_);
371
339
  }
372
- bool Contains(uint32_t priority) { return priority < priorities_.size(); }
373
340
 
374
- XdsLb* xds_policy_;
341
+ RefCountedPtr<XdsLb> xds_policy_;
375
342
 
376
- // The list of locality maps, indexed by priority. P0 is the highest
377
- // priority.
378
- InlinedVector<OrphanablePtr<LocalityMap>, 2> priorities_;
379
- // The priority that is being used.
380
- uint32_t current_priority_ = UINT32_MAX;
343
+ std::map<RefCountedPtr<XdsLocalityName>, OrphanablePtr<Locality>,
344
+ XdsLocalityName::Less>
345
+ localities_;
346
+ const uint32_t priority_;
347
+ grpc_connectivity_state connectivity_state_ = GRPC_CHANNEL_IDLE;
348
+
349
+ // States for delayed removal.
350
+ grpc_timer delayed_removal_timer_;
351
+ grpc_closure on_delayed_removal_timer_;
352
+ bool delayed_removal_timer_callback_pending_ = false;
353
+
354
+ // States of failover.
355
+ grpc_timer failover_timer_;
356
+ grpc_closure on_failover_timer_;
357
+ bool failover_timer_callback_pending_ = false;
381
358
  };
382
359
 
383
360
  ~XdsLb();
384
361
 
385
362
  void ShutdownLocked() override;
386
363
 
387
- // Methods for dealing with fallback state.
388
- void MaybeCancelFallbackAtStartupChecks();
389
- static void OnFallbackTimer(void* arg, grpc_error* error);
390
- static void OnFallbackTimerLocked(void* arg, grpc_error* error);
391
- void UpdateFallbackPolicyLocked();
392
- OrphanablePtr<LoadBalancingPolicy> CreateFallbackPolicyLocked(
393
- const char* name, const grpc_channel_args* args);
394
- void MaybeExitFallbackMode();
395
-
396
364
  const char* eds_service_name() const {
397
365
  if (config_ != nullptr && config_->eds_service_name() != nullptr) {
398
366
  return config_->eds_service_name();
399
367
  }
400
- return server_name_.get();
368
+ return server_name_.c_str();
401
369
  }
402
370
 
403
371
  XdsClient* xds_client() const {
@@ -405,12 +373,36 @@ class XdsLb : public LoadBalancingPolicy {
405
373
  : xds_client_.get();
406
374
  }
407
375
 
376
+ void UpdatePrioritiesLocked(bool update_locality_stats);
377
+ void UpdateXdsPickerLocked();
378
+ void MaybeCreateLocalityMapLocked(uint32_t priority);
379
+ void FailoverOnConnectionFailureLocked();
380
+ void FailoverOnDisconnectionLocked(uint32_t failed_priority);
381
+ void SwitchToHigherPriorityLocked(uint32_t priority);
382
+ void DeactivatePrioritiesLowerThan(uint32_t priority);
383
+ OrphanablePtr<LocalityMap::Locality> ExtractLocalityLocked(
384
+ const RefCountedPtr<XdsLocalityName>& name, uint32_t exclude_priority);
385
+ // Callers should make sure the priority list is non-empty.
386
+ uint32_t LowestPriority() const {
387
+ return static_cast<uint32_t>(priorities_.size()) - 1;
388
+ }
389
+ bool Contains(uint32_t priority) { return priority < priorities_.size(); }
390
+
391
+ // Methods for dealing with fallback state.
392
+ void MaybeCancelFallbackAtStartupChecks();
393
+ static void OnFallbackTimer(void* arg, grpc_error* error);
394
+ static void OnFallbackTimerLocked(void* arg, grpc_error* error);
395
+ void UpdateFallbackPolicyLocked();
396
+ OrphanablePtr<LoadBalancingPolicy> CreateFallbackPolicyLocked(
397
+ const grpc_channel_args* args);
398
+ void MaybeExitFallbackMode();
399
+
408
400
  // Server name from target URI.
409
- grpc_core::UniquePtr<char> server_name_;
401
+ std::string server_name_;
410
402
 
411
403
  // Current channel args and config from the resolver.
412
404
  const grpc_channel_args* args_ = nullptr;
413
- RefCountedPtr<ParsedXdsConfig> config_;
405
+ RefCountedPtr<XdsConfig> config_;
414
406
 
415
407
  // Internal state.
416
408
  bool shutting_down_ = false;
@@ -444,27 +436,29 @@ class XdsLb : public LoadBalancingPolicy {
444
436
 
445
437
  // Non-null iff we are in fallback mode.
446
438
  OrphanablePtr<LoadBalancingPolicy> fallback_policy_;
447
- OrphanablePtr<LoadBalancingPolicy> pending_fallback_policy_;
448
439
 
449
440
  const grpc_millis locality_retention_interval_ms_;
450
441
  const grpc_millis locality_map_failover_timeout_ms_;
451
- // A list of locality maps indexed by priority.
452
- PriorityList priority_list_;
442
+ // The list of locality maps, indexed by priority. P0 is the highest
443
+ // priority.
444
+ InlinedVector<OrphanablePtr<LocalityMap>, 2> priorities_;
445
+ // The priority that is being used.
446
+ uint32_t current_priority_ = UINT32_MAX;
453
447
  // The update for priority_list_.
454
- XdsPriorityListUpdate priority_list_update_;
448
+ XdsApi::PriorityListUpdate priority_list_update_;
455
449
 
456
450
  // The config for dropping calls.
457
- RefCountedPtr<XdsDropConfig> drop_config_;
451
+ RefCountedPtr<XdsApi::DropConfig> drop_config_;
458
452
 
459
- // The stats for client-side load reporting.
460
- XdsClientStats client_stats_;
453
+ // Drop stats for client-side load reporting.
454
+ RefCountedPtr<XdsClusterDropStats> drop_stats_;
461
455
  };
462
456
 
463
457
  //
464
- // XdsLb::EndpointPickerWrapper
458
+ // XdsLb::LoadReportingPicker
465
459
  //
466
460
 
467
- LoadBalancingPolicy::PickResult XdsLb::EndpointPickerWrapper::Pick(
461
+ LoadBalancingPolicy::PickResult XdsLb::LoadReportingPicker::Pick(
468
462
  LoadBalancingPolicy::PickArgs args) {
469
463
  // Forward the pick to the picker returned from the child policy.
470
464
  PickResult result = picker_->Pick(args);
@@ -475,7 +469,7 @@ LoadBalancingPolicy::PickResult XdsLb::EndpointPickerWrapper::Pick(
475
469
  // Record a call started.
476
470
  locality_stats_->AddCallStarted();
477
471
  // Intercept the recv_trailing_metadata op to record call completion.
478
- XdsClientStats::LocalityStats* locality_stats =
472
+ XdsClusterLocalityStats* locality_stats =
479
473
  locality_stats_->Ref(DEBUG_LOCATION, "LocalityStats+call").release();
480
474
  result.recv_trailing_metadata_ready =
481
475
  // Note: This callback does not run in either the control plane
@@ -495,13 +489,23 @@ LoadBalancingPolicy::PickResult XdsLb::EndpointPickerWrapper::Pick(
495
489
 
496
490
  XdsLb::PickResult XdsLb::LocalityPicker::Pick(PickArgs args) {
497
491
  // Handle drop.
498
- const grpc_core::UniquePtr<char>* drop_category;
492
+ const std::string* drop_category;
499
493
  if (drop_config_->ShouldDrop(&drop_category)) {
500
- xds_policy_->client_stats_.AddCallDropped(*drop_category);
494
+ if (drop_stats_ != nullptr) drop_stats_->AddCallDropped(*drop_category);
501
495
  PickResult result;
502
496
  result.type = PickResult::PICK_COMPLETE;
503
497
  return result;
504
498
  }
499
+ // If we didn't drop, we better have some localities to pick from.
500
+ if (pickers_.empty()) { // Should never happen.
501
+ PickResult result;
502
+ result.type = PickResult::PICK_FAILED;
503
+ result.error =
504
+ grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
505
+ "xds picker not given any localities"),
506
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL);
507
+ return result;
508
+ }
505
509
  // Generate a random number in [0, total weight).
506
510
  const uint32_t key = rand() % pickers_[pickers_.size() - 1].first;
507
511
  // Forward pick to whichever locality maps to the range in which the
@@ -535,71 +539,26 @@ XdsLb::PickResult XdsLb::LocalityPicker::PickFromLocality(const uint32_t key,
535
539
  // XdsLb::FallbackHelper
536
540
  //
537
541
 
538
- bool XdsLb::FallbackHelper::CalledByPendingFallback() const {
539
- GPR_ASSERT(child_ != nullptr);
540
- return child_ == parent_->pending_fallback_policy_.get();
541
- }
542
-
543
- bool XdsLb::FallbackHelper::CalledByCurrentFallback() const {
544
- GPR_ASSERT(child_ != nullptr);
545
- return child_ == parent_->fallback_policy_.get();
546
- }
547
-
548
542
  RefCountedPtr<SubchannelInterface> XdsLb::FallbackHelper::CreateSubchannel(
549
543
  const grpc_channel_args& args) {
550
- if (parent_->shutting_down_ ||
551
- (!CalledByPendingFallback() && !CalledByCurrentFallback())) {
552
- return nullptr;
553
- }
544
+ if (parent_->shutting_down_) return nullptr;
554
545
  return parent_->channel_control_helper()->CreateSubchannel(args);
555
546
  }
556
547
 
557
548
  void XdsLb::FallbackHelper::UpdateState(
558
549
  grpc_connectivity_state state, std::unique_ptr<SubchannelPicker> picker) {
559
550
  if (parent_->shutting_down_) return;
560
- // If this request is from the pending fallback policy, ignore it until
561
- // it reports READY, at which point we swap it into place.
562
- if (CalledByPendingFallback()) {
563
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
564
- gpr_log(
565
- GPR_INFO,
566
- "[xdslb %p helper %p] pending fallback policy %p reports state=%s",
567
- parent_.get(), this, parent_->pending_fallback_policy_.get(),
568
- ConnectivityStateName(state));
569
- }
570
- if (state != GRPC_CHANNEL_READY) return;
571
- grpc_pollset_set_del_pollset_set(
572
- parent_->fallback_policy_->interested_parties(),
573
- parent_->interested_parties());
574
- parent_->fallback_policy_ = std::move(parent_->pending_fallback_policy_);
575
- } else if (!CalledByCurrentFallback()) {
576
- // This request is from an outdated fallback policy, so ignore it.
577
- return;
578
- }
579
551
  parent_->channel_control_helper()->UpdateState(state, std::move(picker));
580
552
  }
581
553
 
582
554
  void XdsLb::FallbackHelper::RequestReresolution() {
583
555
  if (parent_->shutting_down_) return;
584
- const LoadBalancingPolicy* latest_fallback_policy =
585
- parent_->pending_fallback_policy_ != nullptr
586
- ? parent_->pending_fallback_policy_.get()
587
- : parent_->fallback_policy_.get();
588
- if (child_ != latest_fallback_policy) return;
589
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
590
- gpr_log(GPR_INFO,
591
- "[xdslb %p] Re-resolution requested from the fallback policy (%p).",
592
- parent_.get(), child_);
593
- }
594
556
  parent_->channel_control_helper()->RequestReresolution();
595
557
  }
596
558
 
597
559
  void XdsLb::FallbackHelper::AddTraceEvent(TraceSeverity severity,
598
560
  StringView message) {
599
- if (parent_->shutting_down_ ||
600
- (!CalledByPendingFallback() && !CalledByCurrentFallback())) {
601
- return;
602
- }
561
+ if (parent_->shutting_down_) return;
603
562
  parent_->channel_control_helper()->AddTraceEvent(severity, message);
604
563
  }
605
564
 
@@ -612,14 +571,16 @@ class XdsLb::EndpointWatcher : public XdsClient::EndpointWatcherInterface {
612
571
  explicit EndpointWatcher(RefCountedPtr<XdsLb> xds_policy)
613
572
  : xds_policy_(std::move(xds_policy)) {}
614
573
 
615
- void OnEndpointChanged(EdsUpdate update) override {
574
+ ~EndpointWatcher() { xds_policy_.reset(DEBUG_LOCATION, "EndpointWatcher"); }
575
+
576
+ void OnEndpointChanged(XdsApi::EdsUpdate update) override {
616
577
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
617
578
  gpr_log(GPR_INFO, "[xdslb %p] Received EDS update from xds client",
618
579
  xds_policy_.get());
619
580
  }
620
581
  // If the balancer tells us to drop all the calls, we should exit fallback
621
582
  // mode immediately.
622
- if (update.drop_all) xds_policy_->MaybeExitFallbackMode();
583
+ if (update.drop_config->drop_all()) xds_policy_->MaybeExitFallbackMode();
623
584
  // Update the drop config.
624
585
  const bool drop_config_changed =
625
586
  xds_policy_->drop_config_ == nullptr ||
@@ -634,13 +595,13 @@ class XdsLb::EndpointWatcher : public XdsClient::EndpointWatcherInterface {
634
595
  xds_policy_.get(), drop_config_changed);
635
596
  }
636
597
  if (drop_config_changed) {
637
- xds_policy_->priority_list_.UpdateXdsPickerLocked();
598
+ xds_policy_->UpdateXdsPickerLocked();
638
599
  }
639
600
  return;
640
601
  }
641
602
  // Update the priority list.
642
603
  xds_policy_->priority_list_update_ = std::move(update.priority_list_update);
643
- xds_policy_->priority_list_.UpdateLocked();
604
+ xds_policy_->UpdatePrioritiesLocked(false /*update_locality_stats*/);
644
605
  }
645
606
 
646
607
  void OnError(grpc_error* error) override {
@@ -670,6 +631,9 @@ class XdsLb::EndpointWatcher : public XdsClient::EndpointWatcherInterface {
670
631
  if (strstr(grpc_error_string(error), "xds call failed")) {
671
632
  xds_policy_->channel_control_helper()->RequestReresolution();
672
633
  }
634
+ } else if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
635
+ gpr_log(GPR_INFO, "[xdslb %p] xds watcher reported error (ignoring): %s",
636
+ xds_policy_.get(), grpc_error_string(error));
673
637
  }
674
638
  GRPC_ERROR_UNREF(error);
675
639
  }
@@ -693,11 +657,9 @@ XdsLb::XdsLb(Args args)
693
657
  {GRPC_XDS_DEFAULT_LOCALITY_RETENTION_INTERVAL_MS, 0, INT_MAX})),
694
658
  locality_map_failover_timeout_ms_(grpc_channel_args_find_integer(
695
659
  args.args, GRPC_ARG_XDS_FAILOVER_TIMEOUT_MS,
696
- {GRPC_XDS_DEFAULT_FAILOVER_TIMEOUT_MS, 0, INT_MAX})),
697
- priority_list_(this) {
698
- if (xds_client_from_channel_ != nullptr &&
699
- GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
700
- gpr_log(GPR_INFO, "[xdslb %p] Using xds client %p from channel", this,
660
+ {GRPC_XDS_DEFAULT_FAILOVER_TIMEOUT_MS, 0, INT_MAX})) {
661
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
662
+ gpr_log(GPR_INFO, "[xdslb %p] created -- xds client from channel: %p", this,
701
663
  xds_client_from_channel_.get());
702
664
  }
703
665
  // Record server name.
@@ -706,11 +668,10 @@ XdsLb::XdsLb(Args args)
706
668
  GPR_ASSERT(server_uri != nullptr);
707
669
  grpc_uri* uri = grpc_uri_parse(server_uri, true);
708
670
  GPR_ASSERT(uri->path[0] != '\0');
709
- server_name_.reset(
710
- gpr_strdup(uri->path[0] == '/' ? uri->path + 1 : uri->path));
671
+ server_name_ = uri->path[0] == '/' ? uri->path + 1 : uri->path;
711
672
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
712
673
  gpr_log(GPR_INFO, "[xdslb %p] server name from channel: %s", this,
713
- server_name_.get());
674
+ server_name_.c_str());
714
675
  }
715
676
  grpc_uri_destroy(uri);
716
677
  }
@@ -728,27 +689,26 @@ void XdsLb::ShutdownLocked() {
728
689
  }
729
690
  shutting_down_ = true;
730
691
  MaybeCancelFallbackAtStartupChecks();
731
- priority_list_.ShutdownLocked();
692
+ priorities_.clear();
693
+ drop_stats_.reset();
732
694
  if (fallback_policy_ != nullptr) {
733
695
  grpc_pollset_set_del_pollset_set(fallback_policy_->interested_parties(),
734
696
  interested_parties());
697
+ fallback_policy_.reset();
735
698
  }
736
- if (pending_fallback_policy_ != nullptr) {
737
- grpc_pollset_set_del_pollset_set(
738
- pending_fallback_policy_->interested_parties(), interested_parties());
699
+ // Cancel the endpoint watch here instead of in our dtor if we are using the
700
+ // XdsResolver, because the watcher holds a ref to us and we might not be
701
+ // destroying the Xds client leading to a situation where the Xds lb policy is
702
+ // never destroyed.
703
+ if (xds_client_from_channel_ != nullptr) {
704
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
705
+ gpr_log(GPR_INFO, "[xdslb %p] cancelling watch for %s", this,
706
+ eds_service_name());
707
+ }
708
+ xds_client()->CancelEndpointDataWatch(StringView(eds_service_name()),
709
+ endpoint_watcher_);
710
+ xds_client_from_channel_.reset();
739
711
  }
740
- fallback_policy_.reset();
741
- pending_fallback_policy_.reset();
742
- // Cancel the endpoint watch here instead of in our dtor, because the
743
- // watcher holds a ref to us.
744
- xds_client()->CancelEndpointDataWatch(StringView(eds_service_name()),
745
- endpoint_watcher_);
746
- if (config_->lrs_load_reporting_server_name() != nullptr) {
747
- xds_client()->RemoveClientStats(
748
- StringView(config_->lrs_load_reporting_server_name()),
749
- StringView(eds_service_name()), &client_stats_);
750
- }
751
- xds_client_from_channel_.reset();
752
712
  xds_client_.reset();
753
713
  }
754
714
 
@@ -761,13 +721,12 @@ void XdsLb::ResetBackoffLocked() {
761
721
  // LB policy, this is done via the resolver, so we don't need to do it
762
722
  // for xds_client_from_channel_ here.
763
723
  if (xds_client_ != nullptr) xds_client_->ResetBackoff();
764
- priority_list_.ResetBackoffLocked();
724
+ for (size_t i = 0; i < priorities_.size(); ++i) {
725
+ priorities_[i]->ResetBackoffLocked();
726
+ }
765
727
  if (fallback_policy_ != nullptr) {
766
728
  fallback_policy_->ResetBackoffLocked();
767
729
  }
768
- if (pending_fallback_policy_ != nullptr) {
769
- pending_fallback_policy_->ResetBackoffLocked();
770
- }
771
730
  }
772
731
 
773
732
  void XdsLb::UpdateLocked(UpdateArgs args) {
@@ -776,7 +735,6 @@ void XdsLb::UpdateLocked(UpdateArgs args) {
776
735
  }
777
736
  const bool is_initial_update = args_ == nullptr;
778
737
  // Update config.
779
- const char* old_eds_service_name = eds_service_name();
780
738
  auto old_config = std::move(config_);
781
739
  config_ = std::move(args.config);
782
740
  // Update fallback address list.
@@ -785,8 +743,6 @@ void XdsLb::UpdateLocked(UpdateArgs args) {
785
743
  grpc_channel_args_destroy(args_);
786
744
  args_ = args.args;
787
745
  args.args = nullptr;
788
- // Update priority list.
789
- priority_list_.UpdateLocked();
790
746
  // Update the existing fallback policy. The fallback policy config and/or the
791
747
  // fallback addresses may be new.
792
748
  if (fallback_policy_ != nullptr) UpdateFallbackPolicyLocked();
@@ -813,41 +769,40 @@ void XdsLb::UpdateLocked(UpdateArgs args) {
813
769
  fallback_at_startup_checks_pending_ = true;
814
770
  grpc_timer_init(&lb_fallback_timer_, deadline, &lb_on_fallback_);
815
771
  }
816
- // Update endpoint watcher if needed.
817
- if (is_initial_update ||
818
- strcmp(old_eds_service_name, eds_service_name()) != 0) {
819
- if (!is_initial_update) {
820
- xds_client()->CancelEndpointDataWatch(StringView(old_eds_service_name),
821
- endpoint_watcher_);
772
+ // Update drop stats for load reporting if needed.
773
+ if (is_initial_update || config_->lrs_load_reporting_server_name() !=
774
+ old_config->lrs_load_reporting_server_name()) {
775
+ drop_stats_.reset();
776
+ if (config_->lrs_load_reporting_server_name().has_value()) {
777
+ drop_stats_ = xds_client()->AddClusterDropStats(
778
+ config_->lrs_load_reporting_server_name().value(),
779
+ // TODO(roth): We currently hard-code the assumption that
780
+ // cluster name and EDS service name are the same. Fix this
781
+ // as part of refectoring this LB policy.
782
+ eds_service_name(), eds_service_name());
822
783
  }
823
- auto watcher = MakeUnique<EndpointWatcher>(Ref());
784
+ }
785
+ // On the initial update, create the endpoint watcher.
786
+ if (is_initial_update) {
787
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
788
+ gpr_log(GPR_INFO, "[xdslb %p] starting watch for %s", this,
789
+ eds_service_name());
790
+ }
791
+ auto watcher = absl::make_unique<EndpointWatcher>(
792
+ Ref(DEBUG_LOCATION, "EndpointWatcher"));
824
793
  endpoint_watcher_ = watcher.get();
825
794
  xds_client()->WatchEndpointData(StringView(eds_service_name()),
826
795
  std::move(watcher));
827
- }
828
- // Update load reporting if needed.
829
- // TODO(roth): Ideally, we should not collect any stats if load reporting
830
- // is disabled, which would require changing this code to recreate
831
- // all of the pickers whenever load reporting is enabled or disabled
832
- // here.
833
- if (is_initial_update ||
834
- (config_->lrs_load_reporting_server_name() == nullptr) !=
835
- (old_config->lrs_load_reporting_server_name() == nullptr) ||
836
- (config_->lrs_load_reporting_server_name() != nullptr &&
837
- old_config->lrs_load_reporting_server_name() != nullptr &&
838
- strcmp(config_->lrs_load_reporting_server_name(),
839
- old_config->lrs_load_reporting_server_name()) != 0)) {
840
- if (old_config != nullptr &&
841
- old_config->lrs_load_reporting_server_name() != nullptr) {
842
- xds_client()->RemoveClientStats(
843
- StringView(old_config->lrs_load_reporting_server_name()),
844
- StringView(old_eds_service_name), &client_stats_);
845
- }
846
- if (config_->lrs_load_reporting_server_name() != nullptr) {
847
- xds_client()->AddClientStats(
848
- StringView(config_->lrs_load_reporting_server_name()),
849
- StringView(eds_service_name()), &client_stats_);
850
- }
796
+ } else {
797
+ // Update priority list.
798
+ // Note that this comes after updating drop_stats_, since we want that
799
+ // to be used by any new picker we create here.
800
+ // No need to do this on the initial update, since there won't be any
801
+ // priorities to update yet.
802
+ const bool update_locality_stats =
803
+ config_->lrs_load_reporting_server_name() !=
804
+ old_config->lrs_load_reporting_server_name();
805
+ UpdatePrioritiesLocked(update_locality_stats);
851
806
  }
852
807
  }
853
808
 
@@ -890,127 +845,37 @@ void XdsLb::OnFallbackTimerLocked(void* arg, grpc_error* error) {
890
845
 
891
846
  void XdsLb::UpdateFallbackPolicyLocked() {
892
847
  if (shutting_down_) return;
893
- // Construct update args.
848
+ // Create policy if needed.
849
+ if (fallback_policy_ == nullptr) {
850
+ fallback_policy_ = CreateFallbackPolicyLocked(args_);
851
+ GPR_ASSERT(fallback_policy_ != nullptr);
852
+ }
853
+ // Perform update.
894
854
  UpdateArgs update_args;
895
855
  update_args.addresses = fallback_backend_addresses_;
896
856
  update_args.config = config_->fallback_policy();
897
857
  update_args.args = grpc_channel_args_copy(args_);
898
- // If the child policy name changes, we need to create a new child
899
- // policy. When this happens, we leave child_policy_ as-is and store
900
- // the new child policy in pending_child_policy_. Once the new child
901
- // policy transitions into state READY, we swap it into child_policy_,
902
- // replacing the original child policy. So pending_child_policy_ is
903
- // non-null only between when we apply an update that changes the child
904
- // policy name and when the new child reports state READY.
905
- //
906
- // Updates can arrive at any point during this transition. We always
907
- // apply updates relative to the most recently created child policy,
908
- // even if the most recent one is still in pending_child_policy_. This
909
- // is true both when applying the updates to an existing child policy
910
- // and when determining whether we need to create a new policy.
911
- //
912
- // As a result of this, there are several cases to consider here:
913
- //
914
- // 1. We have no existing child policy (i.e., we have started up but
915
- // have not yet received a serverlist from the balancer or gone
916
- // into fallback mode; in this case, both child_policy_ and
917
- // pending_child_policy_ are null). In this case, we create a
918
- // new child policy and store it in child_policy_.
919
- //
920
- // 2. We have an existing child policy and have no pending child policy
921
- // from a previous update (i.e., either there has not been a
922
- // previous update that changed the policy name, or we have already
923
- // finished swapping in the new policy; in this case, child_policy_
924
- // is non-null but pending_child_policy_ is null). In this case:
925
- // a. If child_policy_->name() equals child_policy_name, then we
926
- // update the existing child policy.
927
- // b. If child_policy_->name() does not equal child_policy_name,
928
- // we create a new policy. The policy will be stored in
929
- // pending_child_policy_ and will later be swapped into
930
- // child_policy_ by the helper when the new child transitions
931
- // into state READY.
932
- //
933
- // 3. We have an existing child policy and have a pending child policy
934
- // from a previous update (i.e., a previous update set
935
- // pending_child_policy_ as per case 2b above and that policy has
936
- // not yet transitioned into state READY and been swapped into
937
- // child_policy_; in this case, both child_policy_ and
938
- // pending_child_policy_ are non-null). In this case:
939
- // a. If pending_child_policy_->name() equals child_policy_name,
940
- // then we update the existing pending child policy.
941
- // b. If pending_child_policy->name() does not equal
942
- // child_policy_name, then we create a new policy. The new
943
- // policy is stored in pending_child_policy_ (replacing the one
944
- // that was there before, which will be immediately shut down)
945
- // and will later be swapped into child_policy_ by the helper
946
- // when the new child transitions into state READY.
947
- const char* fallback_policy_name = update_args.config == nullptr
948
- ? "round_robin"
949
- : update_args.config->name();
950
- const bool create_policy =
951
- // case 1
952
- fallback_policy_ == nullptr ||
953
- // case 2b
954
- (pending_fallback_policy_ == nullptr &&
955
- strcmp(fallback_policy_->name(), fallback_policy_name) != 0) ||
956
- // case 3b
957
- (pending_fallback_policy_ != nullptr &&
958
- strcmp(pending_fallback_policy_->name(), fallback_policy_name) != 0);
959
- LoadBalancingPolicy* policy_to_update = nullptr;
960
- if (create_policy) {
961
- // Cases 1, 2b, and 3b: create a new child policy.
962
- // If child_policy_ is null, we set it (case 1), else we set
963
- // pending_child_policy_ (cases 2b and 3b).
964
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
965
- gpr_log(GPR_INFO, "[xdslb %p] Creating new %sfallback policy %s", this,
966
- fallback_policy_ == nullptr ? "" : "pending ",
967
- fallback_policy_name);
968
- }
969
- auto& lb_policy = fallback_policy_ == nullptr ? fallback_policy_
970
- : pending_fallback_policy_;
971
- lb_policy =
972
- CreateFallbackPolicyLocked(fallback_policy_name, update_args.args);
973
- policy_to_update = lb_policy.get();
974
- } else {
975
- // Cases 2a and 3a: update an existing policy.
976
- // If we have a pending child policy, send the update to the pending
977
- // policy (case 3a), else send it to the current policy (case 2a).
978
- policy_to_update = pending_fallback_policy_ != nullptr
979
- ? pending_fallback_policy_.get()
980
- : fallback_policy_.get();
981
- }
982
- GPR_ASSERT(policy_to_update != nullptr);
983
- // Update the policy.
984
858
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
985
- gpr_log(
986
- GPR_INFO, "[xdslb %p] Updating %sfallback policy %p", this,
987
- policy_to_update == pending_fallback_policy_.get() ? "pending " : "",
988
- policy_to_update);
859
+ gpr_log(GPR_INFO, "[xdslb %p] Updating fallback child policy handler %p",
860
+ this, fallback_policy_.get());
989
861
  }
990
- policy_to_update->UpdateLocked(std::move(update_args));
862
+ fallback_policy_->UpdateLocked(std::move(update_args));
991
863
  }
992
864
 
993
865
  OrphanablePtr<LoadBalancingPolicy> XdsLb::CreateFallbackPolicyLocked(
994
- const char* name, const grpc_channel_args* args) {
995
- FallbackHelper* helper =
996
- new FallbackHelper(Ref(DEBUG_LOCATION, "FallbackHelper"));
866
+ const grpc_channel_args* args) {
997
867
  LoadBalancingPolicy::Args lb_policy_args;
998
868
  lb_policy_args.combiner = combiner();
999
869
  lb_policy_args.args = args;
1000
870
  lb_policy_args.channel_control_helper =
1001
- std::unique_ptr<ChannelControlHelper>(helper);
871
+ absl::make_unique<FallbackHelper>(Ref(DEBUG_LOCATION, "FallbackHelper"));
1002
872
  OrphanablePtr<LoadBalancingPolicy> lb_policy =
1003
- LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy(
1004
- name, std::move(lb_policy_args));
1005
- if (GPR_UNLIKELY(lb_policy == nullptr)) {
1006
- gpr_log(GPR_ERROR, "[xdslb %p] Failure creating fallback policy %s", this,
1007
- name);
1008
- return nullptr;
1009
- }
1010
- helper->set_child(lb_policy.get());
873
+ MakeOrphanable<ChildPolicyHandler>(std::move(lb_policy_args),
874
+ &grpc_lb_xds_trace);
1011
875
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
1012
- gpr_log(GPR_INFO, "[xdslb %p] Created new fallback policy %s (%p)", this,
1013
- name, lb_policy.get());
876
+ gpr_log(GPR_INFO,
877
+ "[xdslb %p] Created new fallback child policy handler (%p)", this,
878
+ lb_policy.get());
1014
879
  }
1015
880
  // Add the xDS's interested_parties pollset_set to that of the newly created
1016
881
  // child policy. This will make the child policy progress upon activity on xDS
@@ -1024,25 +889,25 @@ void XdsLb::MaybeExitFallbackMode() {
1024
889
  if (fallback_policy_ == nullptr) return;
1025
890
  gpr_log(GPR_INFO, "[xdslb %p] Exiting fallback mode", this);
1026
891
  fallback_policy_.reset();
1027
- pending_fallback_policy_.reset();
1028
892
  }
1029
893
 
1030
894
  //
1031
- // XdsLb::PriorityList
895
+ // priority list-related methods
1032
896
  //
1033
897
 
1034
- void XdsLb::PriorityList::UpdateLocked() {
1035
- const auto& priority_list_update = xds_policy_->priority_list_update_;
898
+ void XdsLb::UpdatePrioritiesLocked(bool update_locality_stats) {
1036
899
  // 1. Remove from the priority list the priorities that are not in the update.
1037
- DeactivatePrioritiesLowerThan(priority_list_update.LowestPriority());
900
+ DeactivatePrioritiesLowerThan(priority_list_update_.LowestPriority());
1038
901
  // 2. Update all the existing priorities.
1039
902
  for (uint32_t priority = 0; priority < priorities_.size(); ++priority) {
1040
903
  LocalityMap* locality_map = priorities_[priority].get();
1041
- const auto* locality_map_update = priority_list_update.Find(priority);
904
+ const auto* locality_map_update = priority_list_update_.Find(priority);
905
+ // If we have more current priorities than exist in the update, stop here.
906
+ if (locality_map_update == nullptr) break;
1042
907
  // Propagate locality_map_update.
1043
908
  // TODO(juanlishen): Find a clean way to skip duplicate update for a
1044
909
  // priority.
1045
- locality_map->UpdateLocked(*locality_map_update);
910
+ locality_map->UpdateLocked(*locality_map_update, update_locality_stats);
1046
911
  }
1047
912
  // 3. Only create a new locality map if all the existing ones have failed.
1048
913
  if (priorities_.empty() ||
@@ -1054,54 +919,62 @@ void XdsLb::PriorityList::UpdateLocked() {
1054
919
  // to be created.
1055
920
  MaybeCreateLocalityMapLocked(new_priority);
1056
921
  }
1057
- }
1058
-
1059
- void XdsLb::PriorityList::ResetBackoffLocked() {
1060
- for (size_t i = 0; i < priorities_.size(); ++i) {
1061
- priorities_[i]->ResetBackoffLocked();
922
+ // 4. If we updated locality stats and we already have at least one
923
+ // priority, update the picker to start using the new stats object(s).
924
+ if (update_locality_stats && !priorities_.empty()) {
925
+ UpdateXdsPickerLocked();
1062
926
  }
1063
927
  }
1064
928
 
1065
- void XdsLb::PriorityList::ShutdownLocked() { priorities_.clear(); }
1066
-
1067
- void XdsLb::PriorityList::UpdateXdsPickerLocked() {
929
+ void XdsLb::UpdateXdsPickerLocked() {
1068
930
  // If we are in fallback mode, don't generate an xds picker from localities.
1069
- if (xds_policy_->fallback_policy_ != nullptr) return;
1070
- if (current_priority() == UINT32_MAX) {
1071
- grpc_error* error = grpc_error_set_int(
1072
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("no ready locality map"),
1073
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
1074
- xds_policy_->channel_control_helper()->UpdateState(
1075
- GRPC_CHANNEL_TRANSIENT_FAILURE,
1076
- MakeUnique<TransientFailurePicker>(error));
931
+ if (fallback_policy_ != nullptr) return;
932
+ // If we're dropping all calls, report READY, even though we won't
933
+ // have a selected priority.
934
+ if (drop_config_ != nullptr && drop_config_->drop_all()) {
935
+ channel_control_helper()->UpdateState(
936
+ GRPC_CHANNEL_READY,
937
+ absl::make_unique<LocalityPicker>(this, LocalityPicker::PickerList{}));
938
+ return;
939
+ }
940
+ // If we don't have a selected priority, report TRANSIENT_FAILURE.
941
+ if (current_priority_ == UINT32_MAX) {
942
+ if (fallback_policy_ == nullptr) {
943
+ grpc_error* error = grpc_error_set_int(
944
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("no ready locality map"),
945
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
946
+ channel_control_helper()->UpdateState(
947
+ GRPC_CHANNEL_TRANSIENT_FAILURE,
948
+ absl::make_unique<TransientFailurePicker>(error));
949
+ }
1077
950
  return;
1078
951
  }
1079
952
  priorities_[current_priority_]->UpdateXdsPickerLocked();
1080
953
  }
1081
954
 
1082
- void XdsLb::PriorityList::MaybeCreateLocalityMapLocked(uint32_t priority) {
955
+ void XdsLb::MaybeCreateLocalityMapLocked(uint32_t priority) {
1083
956
  // Exhausted priorities in the update.
1084
- if (!priority_list_update().Contains(priority)) return;
1085
- auto new_locality_map = new LocalityMap(
1086
- xds_policy_->Ref(DEBUG_LOCATION, "XdsLb+LocalityMap"), priority);
957
+ if (!priority_list_update_.Contains(priority)) return;
958
+ auto new_locality_map =
959
+ new LocalityMap(Ref(DEBUG_LOCATION, "LocalityMap"), priority);
1087
960
  priorities_.emplace_back(OrphanablePtr<LocalityMap>(new_locality_map));
1088
- new_locality_map->UpdateLocked(*priority_list_update().Find(priority));
961
+ new_locality_map->UpdateLocked(*priority_list_update_.Find(priority),
962
+ false /*update_locality_stats*/);
1089
963
  }
1090
964
 
1091
- void XdsLb::PriorityList::FailoverOnConnectionFailureLocked() {
965
+ void XdsLb::FailoverOnConnectionFailureLocked() {
1092
966
  const uint32_t failed_priority = LowestPriority();
1093
967
  // If we're failing over from the lowest priority, report TRANSIENT_FAILURE.
1094
- if (failed_priority == priority_list_update().LowestPriority()) {
968
+ if (failed_priority == priority_list_update_.LowestPriority()) {
1095
969
  UpdateXdsPickerLocked();
1096
970
  }
1097
971
  MaybeCreateLocalityMapLocked(failed_priority + 1);
1098
972
  }
1099
973
 
1100
- void XdsLb::PriorityList::FailoverOnDisconnectionLocked(
1101
- uint32_t failed_priority) {
974
+ void XdsLb::FailoverOnDisconnectionLocked(uint32_t failed_priority) {
1102
975
  current_priority_ = UINT32_MAX;
1103
976
  for (uint32_t next_priority = failed_priority + 1;
1104
- next_priority <= priority_list_update().LowestPriority();
977
+ next_priority <= priority_list_update_.LowestPriority();
1105
978
  ++next_priority) {
1106
979
  if (!Contains(next_priority)) {
1107
980
  MaybeCreateLocalityMapLocked(next_priority);
@@ -1111,17 +984,17 @@ void XdsLb::PriorityList::FailoverOnDisconnectionLocked(
1111
984
  }
1112
985
  }
1113
986
 
1114
- void XdsLb::PriorityList::SwitchToHigherPriorityLocked(uint32_t priority) {
987
+ void XdsLb::SwitchToHigherPriorityLocked(uint32_t priority) {
1115
988
  current_priority_ = priority;
1116
989
  DeactivatePrioritiesLowerThan(current_priority_);
1117
990
  UpdateXdsPickerLocked();
1118
991
  }
1119
992
 
1120
- void XdsLb::PriorityList::DeactivatePrioritiesLowerThan(uint32_t priority) {
993
+ void XdsLb::DeactivatePrioritiesLowerThan(uint32_t priority) {
1121
994
  if (priorities_.empty()) return;
1122
995
  // Deactivate the locality maps from the lowest priority.
1123
996
  for (uint32_t p = LowestPriority(); p > priority; --p) {
1124
- if (xds_policy_->locality_retention_interval_ms_ == 0) {
997
+ if (locality_retention_interval_ms_ == 0) {
1125
998
  priorities_.pop_back();
1126
999
  } else {
1127
1000
  priorities_[p]->DeactivateLocked();
@@ -1129,30 +1002,37 @@ void XdsLb::PriorityList::DeactivatePrioritiesLowerThan(uint32_t priority) {
1129
1002
  }
1130
1003
  }
1131
1004
 
1132
- OrphanablePtr<XdsLb::PriorityList::LocalityMap::Locality>
1133
- XdsLb::PriorityList::ExtractLocalityLocked(
1005
+ OrphanablePtr<XdsLb::LocalityMap::Locality> XdsLb::ExtractLocalityLocked(
1134
1006
  const RefCountedPtr<XdsLocalityName>& name, uint32_t exclude_priority) {
1135
1007
  for (uint32_t priority = 0; priority < priorities_.size(); ++priority) {
1136
1008
  if (priority == exclude_priority) continue;
1137
1009
  LocalityMap* locality_map = priorities_[priority].get();
1138
1010
  auto locality = locality_map->ExtractLocalityLocked(name);
1139
- if (locality != nullptr) return locality;
1011
+ if (locality != nullptr) {
1012
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
1013
+ gpr_log(GPR_INFO,
1014
+ "[xdslb %p] moving locality %p %s to new priority (%" PRIu32
1015
+ " -> %" PRIu32 ")",
1016
+ this, locality.get(), name->AsHumanReadableString(),
1017
+ exclude_priority, priority);
1018
+ }
1019
+ return locality;
1020
+ }
1140
1021
  }
1141
1022
  return nullptr;
1142
1023
  }
1143
1024
 
1144
1025
  //
1145
- // XdsLb::PriorityList::LocalityMap
1026
+ // XdsLb::LocalityMap
1146
1027
  //
1147
1028
 
1148
- XdsLb::PriorityList::LocalityMap::LocalityMap(RefCountedPtr<XdsLb> xds_policy,
1149
- uint32_t priority)
1029
+ XdsLb::LocalityMap::LocalityMap(RefCountedPtr<XdsLb> xds_policy,
1030
+ uint32_t priority)
1150
1031
  : xds_policy_(std::move(xds_policy)), priority_(priority) {
1151
1032
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
1152
1033
  gpr_log(GPR_INFO, "[xdslb %p] Creating priority %" PRIu32,
1153
1034
  xds_policy_.get(), priority_);
1154
1035
  }
1155
-
1156
1036
  GRPC_CLOSURE_INIT(&on_failover_timer_, OnFailoverTimer, this,
1157
1037
  grpc_schedule_on_exec_ctx);
1158
1038
  // Start the failover timer.
@@ -1163,15 +1043,17 @@ XdsLb::PriorityList::LocalityMap::LocalityMap(RefCountedPtr<XdsLb> xds_policy,
1163
1043
  &on_failover_timer_);
1164
1044
  failover_timer_callback_pending_ = true;
1165
1045
  // This is the first locality map ever created, report CONNECTING.
1166
- if (priority_ == 0) {
1046
+ if (priority_ == 0 && xds_policy_->fallback_policy_ == nullptr) {
1167
1047
  xds_policy_->channel_control_helper()->UpdateState(
1168
- GRPC_CHANNEL_CONNECTING, MakeUnique<QueuePicker>(xds_policy_->Ref(
1169
- DEBUG_LOCATION, "QueuePicker")));
1048
+ GRPC_CHANNEL_CONNECTING,
1049
+ absl::make_unique<QueuePicker>(
1050
+ xds_policy_->Ref(DEBUG_LOCATION, "QueuePicker")));
1170
1051
  }
1171
1052
  }
1172
1053
 
1173
- void XdsLb::PriorityList::LocalityMap::UpdateLocked(
1174
- const XdsPriorityListUpdate::LocalityMap& locality_map_update) {
1054
+ void XdsLb::LocalityMap::UpdateLocked(
1055
+ const XdsApi::PriorityListUpdate::LocalityMap& priority_update,
1056
+ bool update_locality_stats) {
1175
1057
  if (xds_policy_->shutting_down_) return;
1176
1058
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
1177
1059
  gpr_log(GPR_INFO, "[xdslb %p] Start Updating priority %" PRIu32,
@@ -1180,11 +1062,11 @@ void XdsLb::PriorityList::LocalityMap::UpdateLocked(
1180
1062
  // Maybe reactivate the locality map in case all the active locality maps have
1181
1063
  // failed.
1182
1064
  MaybeReactivateLocked();
1183
- // Remove (later) the localities not in locality_map_update.
1065
+ // Remove (later) the localities not in priority_update.
1184
1066
  for (auto iter = localities_.begin(); iter != localities_.end();) {
1185
1067
  const auto& name = iter->first;
1186
1068
  Locality* locality = iter->second.get();
1187
- if (locality_map_update.Contains(name)) {
1069
+ if (priority_update.Contains(name)) {
1188
1070
  ++iter;
1189
1071
  continue;
1190
1072
  }
@@ -1195,14 +1077,14 @@ void XdsLb::PriorityList::LocalityMap::UpdateLocked(
1195
1077
  ++iter;
1196
1078
  }
1197
1079
  }
1198
- // Add or update the localities in locality_map_update.
1199
- for (const auto& p : locality_map_update.localities) {
1080
+ // Add or update the localities in priority_update.
1081
+ for (const auto& p : priority_update.localities) {
1200
1082
  const auto& name = p.first;
1201
1083
  const auto& locality_update = p.second;
1202
1084
  OrphanablePtr<Locality>& locality = localities_[name];
1203
1085
  if (locality == nullptr) {
1204
1086
  // Move from another locality map if possible.
1205
- locality = priority_list()->ExtractLocalityLocked(name, priority_);
1087
+ locality = xds_policy_->ExtractLocalityLocked(name, priority_);
1206
1088
  if (locality != nullptr) {
1207
1089
  locality->set_locality_map(
1208
1090
  Ref(DEBUG_LOCATION, "LocalityMap+Locality_move"));
@@ -1214,38 +1096,74 @@ void XdsLb::PriorityList::LocalityMap::UpdateLocked(
1214
1096
  // Keep a copy of serverlist in the update so that we can compare it
1215
1097
  // with the future ones.
1216
1098
  locality->UpdateLocked(locality_update.lb_weight,
1217
- locality_update.serverlist);
1099
+ locality_update.serverlist, update_locality_stats);
1100
+ }
1101
+ // If this is the current priority and we removed all of the READY
1102
+ // localities, go into state CONNECTING.
1103
+ // TODO(roth): Ideally, we should model this as a graceful policy
1104
+ // switch: we should keep using the old localities for a short period
1105
+ // of time, long enough to give the new localities a chance to get
1106
+ // connected. As part of refactoring this policy, we should try to
1107
+ // fix that.
1108
+ if (priority_ == xds_policy()->current_priority_) {
1109
+ bool found_ready = false;
1110
+ for (auto& p : localities_) {
1111
+ const auto& locality_name = p.first;
1112
+ Locality* locality = p.second.get();
1113
+ if (!locality_map_update()->Contains(locality_name)) continue;
1114
+ if (locality->connectivity_state() == GRPC_CHANNEL_READY) {
1115
+ found_ready = true;
1116
+ break;
1117
+ }
1118
+ }
1119
+ if (!found_ready) {
1120
+ xds_policy_->channel_control_helper()->UpdateState(
1121
+ GRPC_CHANNEL_CONNECTING,
1122
+ absl::make_unique<QueuePicker>(
1123
+ xds_policy_->Ref(DEBUG_LOCATION, "QueuePicker")));
1124
+ xds_policy_->current_priority_ = UINT32_MAX;
1125
+ }
1218
1126
  }
1219
1127
  }
1220
1128
 
1221
- void XdsLb::PriorityList::LocalityMap::ResetBackoffLocked() {
1129
+ void XdsLb::LocalityMap::ResetBackoffLocked() {
1222
1130
  for (auto& p : localities_) p.second->ResetBackoffLocked();
1223
1131
  }
1224
1132
 
1225
- void XdsLb::PriorityList::LocalityMap::UpdateXdsPickerLocked() {
1133
+ void XdsLb::LocalityMap::UpdateXdsPickerLocked() {
1134
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
1135
+ gpr_log(GPR_INFO, "[xdslb %p] constructing new picker", xds_policy());
1136
+ }
1226
1137
  // Construct a new xds picker which maintains a map of all locality pickers
1227
1138
  // that are ready. Each locality is represented by a portion of the range
1228
1139
  // proportional to its weight, such that the total range is the sum of the
1229
1140
  // weights of all localities.
1230
1141
  LocalityPicker::PickerList picker_list;
1231
1142
  uint32_t end = 0;
1232
- for (const auto& p : localities_) {
1143
+ for (auto& p : localities_) {
1233
1144
  const auto& locality_name = p.first;
1234
- const Locality* locality = p.second.get();
1145
+ Locality* locality = p.second.get();
1235
1146
  // Skip the localities that are not in the latest locality map update.
1236
- if (!locality_map_update()->Contains(locality_name)) continue;
1147
+ const auto* locality_update = locality_map_update();
1148
+ if (locality_update == nullptr) continue;
1149
+ if (!locality_update->Contains(locality_name)) continue;
1237
1150
  if (locality->connectivity_state() != GRPC_CHANNEL_READY) continue;
1238
1151
  end += locality->weight();
1239
- picker_list.push_back(std::make_pair(end, locality->picker_wrapper()));
1152
+ picker_list.push_back(
1153
+ std::make_pair(end, locality->GetLoadReportingPicker()));
1154
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
1155
+ gpr_log(GPR_INFO, "[xdslb %p] locality=%s weight=%d picker=%p",
1156
+ xds_policy(), locality_name->AsHumanReadableString(),
1157
+ locality->weight(), picker_list.back().second.get());
1158
+ }
1240
1159
  }
1241
1160
  xds_policy()->channel_control_helper()->UpdateState(
1242
- GRPC_CHANNEL_READY, MakeUnique<LocalityPicker>(
1243
- xds_policy_->Ref(DEBUG_LOCATION, "XdsLb+Picker"),
1244
- std::move(picker_list)));
1161
+ GRPC_CHANNEL_READY,
1162
+ absl::make_unique<LocalityPicker>(xds_policy(), std::move(picker_list)));
1245
1163
  }
1246
1164
 
1247
- OrphanablePtr<XdsLb::PriorityList::LocalityMap::Locality>
1248
- XdsLb::PriorityList::LocalityMap::ExtractLocalityLocked(
1165
+ OrphanablePtr<XdsLb::LocalityMap::Locality>
1166
+ XdsLb::LocalityMap::ExtractLocalityLocked(
1249
1167
  const RefCountedPtr<XdsLocalityName>& name) {
1250
1168
  for (auto iter = localities_.begin(); iter != localities_.end(); ++iter) {
1251
1169
  const auto& name_in_map = iter->first;
@@ -1258,7 +1176,11 @@ XdsLb::PriorityList::LocalityMap::ExtractLocalityLocked(
1258
1176
  return nullptr;
1259
1177
  }
1260
1178
 
1261
- void XdsLb::PriorityList::LocalityMap::DeactivateLocked() {
1179
+ void XdsLb::LocalityMap::DeactivateLocked() {
1180
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
1181
+ gpr_log(GPR_INFO, "[xdslb %p] deactivating priority %" PRIu32, xds_policy(),
1182
+ priority_);
1183
+ }
1262
1184
  // If already deactivated, don't do it again.
1263
1185
  if (delayed_removal_timer_callback_pending_) return;
1264
1186
  MaybeCancelFailoverTimerLocked();
@@ -1279,24 +1201,28 @@ void XdsLb::PriorityList::LocalityMap::DeactivateLocked() {
1279
1201
  delayed_removal_timer_callback_pending_ = true;
1280
1202
  }
1281
1203
 
1282
- bool XdsLb::PriorityList::LocalityMap::MaybeReactivateLocked() {
1204
+ bool XdsLb::LocalityMap::MaybeReactivateLocked() {
1283
1205
  // Don't reactivate a priority that is not higher than the current one.
1284
- if (priority_ >= priority_list()->current_priority()) return false;
1206
+ if (priority_ >= xds_policy_->current_priority_) return false;
1285
1207
  // Reactivate this priority by cancelling deletion timer.
1208
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
1209
+ gpr_log(GPR_INFO, "[xdslb %p] reactivating priority %" PRIu32, xds_policy(),
1210
+ priority_);
1211
+ }
1286
1212
  if (delayed_removal_timer_callback_pending_) {
1287
1213
  grpc_timer_cancel(&delayed_removal_timer_);
1288
1214
  }
1289
1215
  // Switch to this higher priority if it's READY.
1290
1216
  if (connectivity_state_ != GRPC_CHANNEL_READY) return false;
1291
- priority_list()->SwitchToHigherPriorityLocked(priority_);
1217
+ xds_policy_->SwitchToHigherPriorityLocked(priority_);
1292
1218
  return true;
1293
1219
  }
1294
1220
 
1295
- void XdsLb::PriorityList::LocalityMap::MaybeCancelFailoverTimerLocked() {
1221
+ void XdsLb::LocalityMap::MaybeCancelFailoverTimerLocked() {
1296
1222
  if (failover_timer_callback_pending_) grpc_timer_cancel(&failover_timer_);
1297
1223
  }
1298
1224
 
1299
- void XdsLb::PriorityList::LocalityMap::Orphan() {
1225
+ void XdsLb::LocalityMap::Orphan() {
1300
1226
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
1301
1227
  gpr_log(GPR_INFO, "[xdslb %p] Priority %" PRIu32 " orphaned.", xds_policy(),
1302
1228
  priority_);
@@ -1309,11 +1235,11 @@ void XdsLb::PriorityList::LocalityMap::Orphan() {
1309
1235
  Unref(DEBUG_LOCATION, "LocalityMap+Orphan");
1310
1236
  }
1311
1237
 
1312
- void XdsLb::PriorityList::LocalityMap::OnLocalityStateUpdateLocked() {
1238
+ void XdsLb::LocalityMap::OnLocalityStateUpdateLocked() {
1313
1239
  UpdateConnectivityStateLocked();
1314
1240
  // Ignore priorities not in priority_list_update.
1315
1241
  if (!priority_list_update().Contains(priority_)) return;
1316
- const uint32_t current_priority = priority_list()->current_priority();
1242
+ const uint32_t current_priority = xds_policy_->current_priority_;
1317
1243
  // Ignore lower-than-current priorities.
1318
1244
  if (priority_ > current_priority) return;
1319
1245
  // Maybe update fallback state.
@@ -1327,13 +1253,13 @@ void XdsLb::PriorityList::LocalityMap::OnLocalityStateUpdateLocked() {
1327
1253
  if (connectivity_state_ == GRPC_CHANNEL_READY) {
1328
1254
  MaybeCancelFailoverTimerLocked();
1329
1255
  // If a higher-than-current priority becomes READY, switch to use it.
1330
- priority_list()->SwitchToHigherPriorityLocked(priority_);
1256
+ xds_policy_->SwitchToHigherPriorityLocked(priority_);
1331
1257
  } else if (connectivity_state_ == GRPC_CHANNEL_TRANSIENT_FAILURE) {
1332
1258
  // If a higher-than-current priority becomes TRANSIENT_FAILURE, only
1333
1259
  // handle it if it's the priority that is still in failover timeout.
1334
1260
  if (failover_timer_callback_pending_) {
1335
1261
  MaybeCancelFailoverTimerLocked();
1336
- priority_list()->FailoverOnConnectionFailureLocked();
1262
+ xds_policy_->FailoverOnConnectionFailureLocked();
1337
1263
  }
1338
1264
  }
1339
1265
  return;
@@ -1341,7 +1267,7 @@ void XdsLb::PriorityList::LocalityMap::OnLocalityStateUpdateLocked() {
1341
1267
  // Update is for current priority.
1342
1268
  if (connectivity_state_ != GRPC_CHANNEL_READY) {
1343
1269
  // Fail over if it's no longer READY.
1344
- priority_list()->FailoverOnDisconnectionLocked(priority_);
1270
+ xds_policy_->FailoverOnDisconnectionLocked(priority_);
1345
1271
  }
1346
1272
  // At this point, one of the following things has happened to the current
1347
1273
  // priority.
@@ -1349,10 +1275,10 @@ void XdsLb::PriorityList::LocalityMap::OnLocalityStateUpdateLocked() {
1349
1275
  // 2. It changed to a lower priority due to failover.
1350
1276
  // 3. It became invalid because failover didn't yield a READY priority.
1351
1277
  // In any case, update the xds picker.
1352
- priority_list()->UpdateXdsPickerLocked();
1278
+ xds_policy_->UpdateXdsPickerLocked();
1353
1279
  }
1354
1280
 
1355
- void XdsLb::PriorityList::LocalityMap::UpdateConnectivityStateLocked() {
1281
+ void XdsLb::LocalityMap::UpdateConnectivityStateLocked() {
1356
1282
  size_t num_ready = 0;
1357
1283
  size_t num_connecting = 0;
1358
1284
  size_t num_idle = 0;
@@ -1400,8 +1326,7 @@ void XdsLb::PriorityList::LocalityMap::UpdateConnectivityStateLocked() {
1400
1326
  }
1401
1327
  }
1402
1328
 
1403
- void XdsLb::PriorityList::LocalityMap::OnDelayedRemovalTimer(
1404
- void* arg, grpc_error* error) {
1329
+ void XdsLb::LocalityMap::OnDelayedRemovalTimer(void* arg, grpc_error* error) {
1405
1330
  LocalityMap* self = static_cast<LocalityMap*>(arg);
1406
1331
  self->xds_policy_->combiner()->Run(
1407
1332
  GRPC_CLOSURE_INIT(&self->on_delayed_removal_timer_,
@@ -1409,14 +1334,13 @@ void XdsLb::PriorityList::LocalityMap::OnDelayedRemovalTimer(
1409
1334
  GRPC_ERROR_REF(error));
1410
1335
  }
1411
1336
 
1412
- void XdsLb::PriorityList::LocalityMap::OnDelayedRemovalTimerLocked(
1413
- void* arg, grpc_error* error) {
1337
+ void XdsLb::LocalityMap::OnDelayedRemovalTimerLocked(void* arg,
1338
+ grpc_error* error) {
1414
1339
  LocalityMap* self = static_cast<LocalityMap*>(arg);
1415
1340
  self->delayed_removal_timer_callback_pending_ = false;
1416
1341
  if (error == GRPC_ERROR_NONE && !self->xds_policy_->shutting_down_) {
1417
- auto* priority_list = self->priority_list();
1418
1342
  const bool keep = self->priority_list_update().Contains(self->priority_) &&
1419
- self->priority_ <= priority_list->current_priority();
1343
+ self->priority_ <= self->xds_policy_->current_priority_;
1420
1344
  if (!keep) {
1421
1345
  // This check is to make sure we always delete the locality maps from
1422
1346
  // the lowest priority even if the closures of the back-to-back timers
@@ -1425,8 +1349,8 @@ void XdsLb::PriorityList::LocalityMap::OnDelayedRemovalTimerLocked(
1425
1349
  // deactivated locality maps when out-of-order closures are run.
1426
1350
  // TODO(juanlishen): Check the timer implementation to see if this
1427
1351
  // defense is necessary.
1428
- if (self->priority_ == priority_list->LowestPriority()) {
1429
- priority_list->priorities_.pop_back();
1352
+ if (self->priority_ == self->xds_policy_->LowestPriority()) {
1353
+ self->xds_policy_->priorities_.pop_back();
1430
1354
  } else {
1431
1355
  gpr_log(GPR_ERROR,
1432
1356
  "[xdslb %p] Priority %" PRIu32
@@ -1439,8 +1363,7 @@ void XdsLb::PriorityList::LocalityMap::OnDelayedRemovalTimerLocked(
1439
1363
  self->Unref(DEBUG_LOCATION, "LocalityMap+timer");
1440
1364
  }
1441
1365
 
1442
- void XdsLb::PriorityList::LocalityMap::OnFailoverTimer(void* arg,
1443
- grpc_error* error) {
1366
+ void XdsLb::LocalityMap::OnFailoverTimer(void* arg, grpc_error* error) {
1444
1367
  LocalityMap* self = static_cast<LocalityMap*>(arg);
1445
1368
  self->xds_policy_->combiner()->Run(
1446
1369
  GRPC_CLOSURE_INIT(&self->on_failover_timer_, OnFailoverTimerLocked, self,
@@ -1448,31 +1371,31 @@ void XdsLb::PriorityList::LocalityMap::OnFailoverTimer(void* arg,
1448
1371
  GRPC_ERROR_REF(error));
1449
1372
  }
1450
1373
 
1451
- void XdsLb::PriorityList::LocalityMap::OnFailoverTimerLocked(
1452
- void* arg, grpc_error* error) {
1374
+ void XdsLb::LocalityMap::OnFailoverTimerLocked(void* arg, grpc_error* error) {
1453
1375
  LocalityMap* self = static_cast<LocalityMap*>(arg);
1454
1376
  self->failover_timer_callback_pending_ = false;
1455
1377
  if (error == GRPC_ERROR_NONE && !self->xds_policy_->shutting_down_) {
1456
- self->priority_list()->FailoverOnConnectionFailureLocked();
1378
+ self->xds_policy_->FailoverOnConnectionFailureLocked();
1457
1379
  }
1458
1380
  self->Unref(DEBUG_LOCATION, "LocalityMap+OnFailoverTimerLocked");
1459
1381
  }
1460
1382
 
1461
1383
  //
1462
- // XdsLb::PriorityList::LocalityMap::Locality
1384
+ // XdsLb::LocalityMap::Locality
1463
1385
  //
1464
1386
 
1465
- XdsLb::PriorityList::LocalityMap::Locality::Locality(
1466
- RefCountedPtr<LocalityMap> locality_map,
1467
- RefCountedPtr<XdsLocalityName> name)
1387
+ XdsLb::LocalityMap::Locality::Locality(RefCountedPtr<LocalityMap> locality_map,
1388
+ RefCountedPtr<XdsLocalityName> name)
1468
1389
  : locality_map_(std::move(locality_map)), name_(std::move(name)) {
1469
1390
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
1470
1391
  gpr_log(GPR_INFO, "[xdslb %p] created Locality %p for %s", xds_policy(),
1471
1392
  this, name_->AsHumanReadableString());
1472
1393
  }
1394
+ // Initialize locality stats if load reporting is enabled.
1395
+ UpdateLocalityStats();
1473
1396
  }
1474
1397
 
1475
- XdsLb::PriorityList::LocalityMap::Locality::~Locality() {
1398
+ XdsLb::LocalityMap::Locality::~Locality() {
1476
1399
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
1477
1400
  gpr_log(GPR_INFO, "[xdslb %p] Locality %p %s: destroying locality",
1478
1401
  xds_policy(), this, name_->AsHumanReadableString());
@@ -1480,8 +1403,20 @@ XdsLb::PriorityList::LocalityMap::Locality::~Locality() {
1480
1403
  locality_map_.reset(DEBUG_LOCATION, "Locality");
1481
1404
  }
1482
1405
 
1483
- grpc_channel_args*
1484
- XdsLb::PriorityList::LocalityMap::Locality::CreateChildPolicyArgsLocked(
1406
+ void XdsLb::LocalityMap::Locality::UpdateLocalityStats() {
1407
+ stats_.reset();
1408
+ if (xds_policy()->config_->lrs_load_reporting_server_name().has_value()) {
1409
+ stats_ = xds_policy()->xds_client()->AddClusterLocalityStats(
1410
+ xds_policy()->config_->lrs_load_reporting_server_name().value(),
1411
+ // TODO(roth): We currently hard-code the assumption that
1412
+ // cluster name and EDS service name are the same. Fix this
1413
+ // as part of refectoring this LB policy.
1414
+ xds_policy()->eds_service_name(), xds_policy()->eds_service_name(),
1415
+ name_);
1416
+ }
1417
+ }
1418
+
1419
+ grpc_channel_args* XdsLb::LocalityMap::Locality::CreateChildPolicyArgsLocked(
1485
1420
  const grpc_channel_args* args_in) {
1486
1421
  const grpc_arg args_to_add[] = {
1487
1422
  // A channel arg indicating if the target is a backend inferred from a
@@ -1499,28 +1434,20 @@ XdsLb::PriorityList::LocalityMap::Locality::CreateChildPolicyArgsLocked(
1499
1434
  }
1500
1435
 
1501
1436
  OrphanablePtr<LoadBalancingPolicy>
1502
- XdsLb::PriorityList::LocalityMap::Locality::CreateChildPolicyLocked(
1503
- const char* name, const grpc_channel_args* args) {
1504
- Helper* helper = new Helper(this->Ref(DEBUG_LOCATION, "Helper"));
1437
+ XdsLb::LocalityMap::Locality::CreateChildPolicyLocked(
1438
+ const grpc_channel_args* args) {
1505
1439
  LoadBalancingPolicy::Args lb_policy_args;
1506
1440
  lb_policy_args.combiner = xds_policy()->combiner();
1507
1441
  lb_policy_args.args = args;
1508
1442
  lb_policy_args.channel_control_helper =
1509
- std::unique_ptr<ChannelControlHelper>(helper);
1443
+ absl::make_unique<Helper>(this->Ref(DEBUG_LOCATION, "Helper"));
1510
1444
  OrphanablePtr<LoadBalancingPolicy> lb_policy =
1511
- LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy(
1512
- name, std::move(lb_policy_args));
1513
- if (GPR_UNLIKELY(lb_policy == nullptr)) {
1514
- gpr_log(GPR_ERROR,
1515
- "[xdslb %p] Locality %p %s: failure creating child policy %s",
1516
- xds_policy(), this, name_->AsHumanReadableString(), name);
1517
- return nullptr;
1518
- }
1519
- helper->set_child(lb_policy.get());
1445
+ MakeOrphanable<ChildPolicyHandler>(std::move(lb_policy_args),
1446
+ &grpc_lb_xds_trace);
1520
1447
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
1521
1448
  gpr_log(GPR_INFO,
1522
- "[xdslb %p] Locality %p %s: Created new child policy %s (%p)",
1523
- xds_policy(), this, name_->AsHumanReadableString(), name,
1449
+ "[xdslb %p] Locality %p %s: Created new child policy handler (%p)",
1450
+ xds_policy(), this, name_->AsHumanReadableString(),
1524
1451
  lb_policy.get());
1525
1452
  }
1526
1453
  // Add the xDS's interested_parties pollset_set to that of the newly created
@@ -1531,134 +1458,55 @@ XdsLb::PriorityList::LocalityMap::Locality::CreateChildPolicyLocked(
1531
1458
  return lb_policy;
1532
1459
  }
1533
1460
 
1534
- void XdsLb::PriorityList::LocalityMap::Locality::UpdateLocked(
1535
- uint32_t locality_weight, ServerAddressList serverlist) {
1461
+ void XdsLb::LocalityMap::Locality::UpdateLocked(uint32_t locality_weight,
1462
+ ServerAddressList serverlist,
1463
+ bool update_locality_stats) {
1536
1464
  if (xds_policy()->shutting_down_) return;
1537
1465
  // Update locality weight.
1538
1466
  weight_ = locality_weight;
1539
1467
  if (delayed_removal_timer_callback_pending_) {
1468
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
1469
+ gpr_log(GPR_INFO, "[xdslb %p] Locality %p %s: reactivating", xds_policy(),
1470
+ this, name_->AsHumanReadableString());
1471
+ }
1540
1472
  grpc_timer_cancel(&delayed_removal_timer_);
1541
1473
  }
1474
+ // Update locality stats.
1475
+ if (update_locality_stats) UpdateLocalityStats();
1542
1476
  // Construct update args.
1543
1477
  UpdateArgs update_args;
1544
1478
  update_args.addresses = std::move(serverlist);
1545
1479
  update_args.config = xds_policy()->config_->child_policy();
1546
1480
  update_args.args = CreateChildPolicyArgsLocked(xds_policy()->args_);
1547
- // If the child policy name changes, we need to create a new child
1548
- // policy. When this happens, we leave child_policy_ as-is and store
1549
- // the new child policy in pending_child_policy_. Once the new child
1550
- // policy transitions into state READY, we swap it into child_policy_,
1551
- // replacing the original child policy. So pending_child_policy_ is
1552
- // non-null only between when we apply an update that changes the child
1553
- // policy name and when the new child reports state READY.
1554
- //
1555
- // Updates can arrive at any point during this transition. We always
1556
- // apply updates relative to the most recently created child policy,
1557
- // even if the most recent one is still in pending_child_policy_. This
1558
- // is true both when applying the updates to an existing child policy
1559
- // and when determining whether we need to create a new policy.
1560
- //
1561
- // As a result of this, there are several cases to consider here:
1562
- //
1563
- // 1. We have no existing child policy (i.e., we have started up but
1564
- // have not yet received a serverlist from the balancer or gone
1565
- // into fallback mode; in this case, both child_policy_ and
1566
- // pending_child_policy_ are null). In this case, we create a
1567
- // new child policy and store it in child_policy_.
1568
- //
1569
- // 2. We have an existing child policy and have no pending child policy
1570
- // from a previous update (i.e., either there has not been a
1571
- // previous update that changed the policy name, or we have already
1572
- // finished swapping in the new policy; in this case, child_policy_
1573
- // is non-null but pending_child_policy_ is null). In this case:
1574
- // a. If child_policy_->name() equals child_policy_name, then we
1575
- // update the existing child policy.
1576
- // b. If child_policy_->name() does not equal child_policy_name,
1577
- // we create a new policy. The policy will be stored in
1578
- // pending_child_policy_ and will later be swapped into
1579
- // child_policy_ by the helper when the new child transitions
1580
- // into state READY.
1581
- //
1582
- // 3. We have an existing child policy and have a pending child policy
1583
- // from a previous update (i.e., a previous update set
1584
- // pending_child_policy_ as per case 2b above and that policy has
1585
- // not yet transitioned into state READY and been swapped into
1586
- // child_policy_; in this case, both child_policy_ and
1587
- // pending_child_policy_ are non-null). In this case:
1588
- // a. If pending_child_policy_->name() equals child_policy_name,
1589
- // then we update the existing pending child policy.
1590
- // b. If pending_child_policy->name() does not equal
1591
- // child_policy_name, then we create a new policy. The new
1592
- // policy is stored in pending_child_policy_ (replacing the one
1593
- // that was there before, which will be immediately shut down)
1594
- // and will later be swapped into child_policy_ by the helper
1595
- // when the new child transitions into state READY.
1596
- // TODO(juanlishen): If the child policy is not configured via service config,
1597
- // use whatever algorithm is specified by the balancer.
1598
- const char* child_policy_name = update_args.config == nullptr
1599
- ? "round_robin"
1600
- : update_args.config->name();
1601
- const bool create_policy =
1602
- // case 1
1603
- child_policy_ == nullptr ||
1604
- // case 2b
1605
- (pending_child_policy_ == nullptr &&
1606
- strcmp(child_policy_->name(), child_policy_name) != 0) ||
1607
- // case 3b
1608
- (pending_child_policy_ != nullptr &&
1609
- strcmp(pending_child_policy_->name(), child_policy_name) != 0);
1610
- LoadBalancingPolicy* policy_to_update = nullptr;
1611
- if (create_policy) {
1612
- // Cases 1, 2b, and 3b: create a new child policy.
1613
- // If child_policy_ is null, we set it (case 1), else we set
1614
- // pending_child_policy_ (cases 2b and 3b).
1615
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
1616
- gpr_log(GPR_INFO,
1617
- "[xdslb %p] Locality %p %s: Creating new %schild policy %s",
1618
- xds_policy(), this, name_->AsHumanReadableString(),
1619
- child_policy_ == nullptr ? "" : "pending ", child_policy_name);
1620
- }
1621
- auto& lb_policy =
1622
- child_policy_ == nullptr ? child_policy_ : pending_child_policy_;
1623
- lb_policy = CreateChildPolicyLocked(child_policy_name, update_args.args);
1624
- policy_to_update = lb_policy.get();
1625
- } else {
1626
- // Cases 2a and 3a: update an existing policy.
1627
- // If we have a pending child policy, send the update to the pending
1628
- // policy (case 3a), else send it to the current policy (case 2a).
1629
- policy_to_update = pending_child_policy_ != nullptr
1630
- ? pending_child_policy_.get()
1631
- : child_policy_.get();
1632
- }
1633
- GPR_ASSERT(policy_to_update != nullptr);
1481
+ // Create child policy if needed.
1482
+ if (child_policy_ == nullptr) {
1483
+ child_policy_ = CreateChildPolicyLocked(update_args.args);
1484
+ GPR_ASSERT(child_policy_ != nullptr);
1485
+ }
1634
1486
  // Update the policy.
1635
1487
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
1636
- gpr_log(GPR_INFO, "[xdslb %p] Locality %p %s: Updating %schild policy %p",
1488
+ gpr_log(GPR_INFO,
1489
+ "[xdslb %p] Locality %p %s: Updating child policy handler %p",
1637
1490
  xds_policy(), this, name_->AsHumanReadableString(),
1638
- policy_to_update == pending_child_policy_.get() ? "pending " : "",
1639
- policy_to_update);
1491
+ child_policy_.get());
1640
1492
  }
1641
- policy_to_update->UpdateLocked(std::move(update_args));
1493
+ child_policy_->UpdateLocked(std::move(update_args));
1642
1494
  }
1643
1495
 
1644
- void XdsLb::PriorityList::LocalityMap::Locality::ShutdownLocked() {
1496
+ void XdsLb::LocalityMap::Locality::ShutdownLocked() {
1645
1497
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
1646
1498
  gpr_log(GPR_INFO, "[xdslb %p] Locality %p %s: shutting down locality",
1647
1499
  xds_policy(), this, name_->AsHumanReadableString());
1648
1500
  }
1501
+ stats_.reset();
1649
1502
  // Remove the child policy's interested_parties pollset_set from the
1650
1503
  // xDS policy.
1651
1504
  grpc_pollset_set_del_pollset_set(child_policy_->interested_parties(),
1652
1505
  xds_policy()->interested_parties());
1653
1506
  child_policy_.reset();
1654
- if (pending_child_policy_ != nullptr) {
1655
- grpc_pollset_set_del_pollset_set(
1656
- pending_child_policy_->interested_parties(),
1657
- xds_policy()->interested_parties());
1658
- pending_child_policy_.reset();
1659
- }
1660
1507
  // Drop our ref to the child's picker, in case it's holding a ref to
1661
1508
  // the child.
1509
+ load_reporting_picker_.reset();
1662
1510
  picker_wrapper_.reset();
1663
1511
  if (delayed_removal_timer_callback_pending_) {
1664
1512
  grpc_timer_cancel(&delayed_removal_timer_);
@@ -1666,21 +1514,22 @@ void XdsLb::PriorityList::LocalityMap::Locality::ShutdownLocked() {
1666
1514
  shutdown_ = true;
1667
1515
  }
1668
1516
 
1669
- void XdsLb::PriorityList::LocalityMap::Locality::ResetBackoffLocked() {
1517
+ void XdsLb::LocalityMap::Locality::ResetBackoffLocked() {
1670
1518
  child_policy_->ResetBackoffLocked();
1671
- if (pending_child_policy_ != nullptr) {
1672
- pending_child_policy_->ResetBackoffLocked();
1673
- }
1674
1519
  }
1675
1520
 
1676
- void XdsLb::PriorityList::LocalityMap::Locality::Orphan() {
1521
+ void XdsLb::LocalityMap::Locality::Orphan() {
1677
1522
  ShutdownLocked();
1678
1523
  Unref();
1679
1524
  }
1680
1525
 
1681
- void XdsLb::PriorityList::LocalityMap::Locality::DeactivateLocked() {
1526
+ void XdsLb::LocalityMap::Locality::DeactivateLocked() {
1682
1527
  // If already deactivated, don't do that again.
1683
1528
  if (weight_ == 0) return;
1529
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
1530
+ gpr_log(GPR_INFO, "[xdslb %p] Locality %p %s: deactivating", xds_policy(),
1531
+ this, name_->AsHumanReadableString());
1532
+ }
1684
1533
  // Set the locality weight to 0 so that future xds picker won't contain this
1685
1534
  // locality.
1686
1535
  weight_ = 0;
@@ -1695,8 +1544,8 @@ void XdsLb::PriorityList::LocalityMap::Locality::DeactivateLocked() {
1695
1544
  delayed_removal_timer_callback_pending_ = true;
1696
1545
  }
1697
1546
 
1698
- void XdsLb::PriorityList::LocalityMap::Locality::OnDelayedRemovalTimer(
1699
- void* arg, grpc_error* error) {
1547
+ void XdsLb::LocalityMap::Locality::OnDelayedRemovalTimer(void* arg,
1548
+ grpc_error* error) {
1700
1549
  Locality* self = static_cast<Locality*>(arg);
1701
1550
  self->xds_policy()->combiner()->Run(
1702
1551
  GRPC_CLOSURE_INIT(&self->on_delayed_removal_timer_,
@@ -1704,7 +1553,7 @@ void XdsLb::PriorityList::LocalityMap::Locality::OnDelayedRemovalTimer(
1704
1553
  GRPC_ERROR_REF(error));
1705
1554
  }
1706
1555
 
1707
- void XdsLb::PriorityList::LocalityMap::Locality::OnDelayedRemovalTimerLocked(
1556
+ void XdsLb::LocalityMap::Locality::OnDelayedRemovalTimerLocked(
1708
1557
  void* arg, grpc_error* error) {
1709
1558
  Locality* self = static_cast<Locality*>(arg);
1710
1559
  self->delayed_removal_timer_callback_pending_ = false;
@@ -1715,74 +1564,37 @@ void XdsLb::PriorityList::LocalityMap::Locality::OnDelayedRemovalTimerLocked(
1715
1564
  }
1716
1565
 
1717
1566
  //
1718
- // XdsLb::Locality::Helper
1567
+ // XdsLb::LocalityMap::Locality::Helper
1719
1568
  //
1720
1569
 
1721
- bool XdsLb::PriorityList::LocalityMap::Locality::Helper::CalledByPendingChild()
1722
- const {
1723
- GPR_ASSERT(child_ != nullptr);
1724
- return child_ == locality_->pending_child_policy_.get();
1725
- }
1726
-
1727
- bool XdsLb::PriorityList::LocalityMap::Locality::Helper::CalledByCurrentChild()
1728
- const {
1729
- GPR_ASSERT(child_ != nullptr);
1730
- return child_ == locality_->child_policy_.get();
1731
- }
1732
-
1733
1570
  RefCountedPtr<SubchannelInterface>
1734
- XdsLb::PriorityList::LocalityMap::Locality::Helper::CreateSubchannel(
1571
+ XdsLb::LocalityMap::Locality::Helper::CreateSubchannel(
1735
1572
  const grpc_channel_args& args) {
1736
- if (locality_->xds_policy()->shutting_down_ ||
1737
- (!CalledByPendingChild() && !CalledByCurrentChild())) {
1738
- return nullptr;
1739
- }
1573
+ if (locality_->xds_policy()->shutting_down_) return nullptr;
1740
1574
  return locality_->xds_policy()->channel_control_helper()->CreateSubchannel(
1741
1575
  args);
1742
1576
  }
1743
1577
 
1744
- void XdsLb::PriorityList::LocalityMap::Locality::Helper::UpdateState(
1578
+ void XdsLb::LocalityMap::Locality::Helper::UpdateState(
1745
1579
  grpc_connectivity_state state, std::unique_ptr<SubchannelPicker> picker) {
1746
1580
  if (locality_->xds_policy()->shutting_down_) return;
1747
- // If this request is from the pending child policy, ignore it until
1748
- // it reports READY, at which point we swap it into place.
1749
- if (CalledByPendingChild()) {
1750
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
1751
- gpr_log(GPR_INFO,
1752
- "[xdslb %p helper %p] pending child policy %p reports state=%s",
1753
- locality_->xds_policy(), this,
1754
- locality_->pending_child_policy_.get(),
1755
- ConnectivityStateName(state));
1756
- }
1757
- if (state != GRPC_CHANNEL_READY) return;
1758
- grpc_pollset_set_del_pollset_set(
1759
- locality_->child_policy_->interested_parties(),
1760
- locality_->xds_policy()->interested_parties());
1761
- locality_->child_policy_ = std::move(locality_->pending_child_policy_);
1762
- } else if (!CalledByCurrentChild()) {
1763
- // This request is from an outdated child, so ignore it.
1764
- return;
1581
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) {
1582
+ gpr_log(GPR_INFO,
1583
+ "[xdslb %p helper %p] child policy handler %p reports state=%s",
1584
+ locality_->xds_policy(), this, locality_->child_policy_.get(),
1585
+ ConnectivityStateName(state));
1765
1586
  }
1766
- // Cache the picker and its state in the locality.
1767
- // TODO(roth): If load reporting is not configured, we should ideally
1768
- // pass a null LocalityStats ref to the EndpointPickerWrapper and have it
1769
- // not collect any stats, since they're not going to be used. This would
1770
- // require recreating all of the pickers whenever we get a config update.
1771
- locality_->picker_wrapper_ = MakeRefCounted<EndpointPickerWrapper>(
1772
- std::move(picker),
1773
- locality_->xds_policy()->client_stats_.FindLocalityStats(
1774
- locality_->name_));
1587
+ // Cache the state and picker in the locality.
1775
1588
  locality_->connectivity_state_ = state;
1589
+ locality_->picker_wrapper_ =
1590
+ MakeRefCounted<RefCountedEndpointPicker>(std::move(picker));
1776
1591
  // Notify the locality map.
1777
1592
  locality_->locality_map_->OnLocalityStateUpdateLocked();
1778
1593
  }
1779
1594
 
1780
- void XdsLb::PriorityList::LocalityMap::Locality::Helper::AddTraceEvent(
1781
- TraceSeverity severity, StringView message) {
1782
- if (locality_->xds_policy()->shutting_down_ ||
1783
- (!CalledByPendingChild() && !CalledByCurrentChild())) {
1784
- return;
1785
- }
1595
+ void XdsLb::LocalityMap::Locality::Helper::AddTraceEvent(TraceSeverity severity,
1596
+ StringView message) {
1597
+ if (locality_->xds_policy()->shutting_down_) return;
1786
1598
  locality_->xds_policy()->channel_control_helper()->AddTraceEvent(severity,
1787
1599
  message);
1788
1600
  }
@@ -1795,15 +1607,15 @@ class XdsFactory : public LoadBalancingPolicyFactory {
1795
1607
  public:
1796
1608
  OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
1797
1609
  LoadBalancingPolicy::Args args) const override {
1798
- return MakeOrphanable<XdsLb>(std::move(args));
1610
+ return MakeOrphanable<XdsChildHandler>(std::move(args), &grpc_lb_xds_trace);
1799
1611
  }
1800
1612
 
1801
1613
  const char* name() const override { return kXds; }
1802
1614
 
1803
1615
  RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
1804
- const grpc_json* json, grpc_error** error) const override {
1616
+ const Json& json, grpc_error** error) const override {
1805
1617
  GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE);
1806
- if (json == nullptr) {
1618
+ if (json.type() == Json::Type::JSON_NULL) {
1807
1619
  // xds was mentioned as a policy in the deprecated loadBalancingPolicy
1808
1620
  // field or in the client API.
1809
1621
  *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
@@ -1811,74 +1623,118 @@ class XdsFactory : public LoadBalancingPolicyFactory {
1811
1623
  "Please use loadBalancingConfig field of service config instead.");
1812
1624
  return nullptr;
1813
1625
  }
1814
- GPR_DEBUG_ASSERT(strcmp(json->key, name()) == 0);
1815
- InlinedVector<grpc_error*, 3> error_list;
1816
- RefCountedPtr<LoadBalancingPolicy::Config> child_policy;
1817
- RefCountedPtr<LoadBalancingPolicy::Config> fallback_policy;
1626
+ std::vector<grpc_error*> error_list;
1627
+ // Child policy.
1628
+ Json json_tmp;
1629
+ const Json* child_policy_json;
1630
+ auto it = json.object_value().find("childPolicy");
1631
+ if (it == json.object_value().end()) {
1632
+ json_tmp = Json::Array{Json::Object{
1633
+ {"round_robin", Json::Object()},
1634
+ }};
1635
+ child_policy_json = &json_tmp;
1636
+ } else {
1637
+ child_policy_json = &it->second;
1638
+ }
1639
+ grpc_error* parse_error = GRPC_ERROR_NONE;
1640
+ RefCountedPtr<LoadBalancingPolicy::Config> child_policy =
1641
+ LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
1642
+ *child_policy_json, &parse_error);
1643
+ if (child_policy == nullptr) {
1644
+ GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE);
1645
+ std::vector<grpc_error*> child_errors;
1646
+ child_errors.push_back(parse_error);
1647
+ error_list.push_back(
1648
+ GRPC_ERROR_CREATE_FROM_VECTOR("field:childPolicy", &child_errors));
1649
+ }
1650
+ // Fallback policy.
1651
+ const Json* fallback_policy_json;
1652
+ it = json.object_value().find("fallbackPolicy");
1653
+ if (it == json.object_value().end()) {
1654
+ json_tmp = Json::Array{Json::Object{
1655
+ {"round_robin", Json::Object()},
1656
+ }};
1657
+ fallback_policy_json = &json_tmp;
1658
+ } else {
1659
+ fallback_policy_json = &it->second;
1660
+ }
1661
+ RefCountedPtr<LoadBalancingPolicy::Config> fallback_policy =
1662
+ LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
1663
+ *fallback_policy_json, &parse_error);
1664
+ if (fallback_policy == nullptr) {
1665
+ GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE);
1666
+ std::vector<grpc_error*> child_errors;
1667
+ child_errors.push_back(parse_error);
1668
+ error_list.push_back(
1669
+ GRPC_ERROR_CREATE_FROM_VECTOR("field:fallbackPolicy", &child_errors));
1670
+ }
1671
+ // EDS service name.
1818
1672
  const char* eds_service_name = nullptr;
1673
+ it = json.object_value().find("edsServiceName");
1674
+ if (it != json.object_value().end()) {
1675
+ if (it->second.type() != Json::Type::STRING) {
1676
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1677
+ "field:edsServiceName error:type should be string"));
1678
+ } else {
1679
+ eds_service_name = it->second.string_value().c_str();
1680
+ }
1681
+ }
1682
+ // LRS load reporting server name.
1819
1683
  const char* lrs_load_reporting_server_name = nullptr;
1820
- for (const grpc_json* field = json->child; field != nullptr;
1821
- field = field->next) {
1822
- if (field->key == nullptr) continue;
1823
- if (strcmp(field->key, "childPolicy") == 0) {
1824
- if (child_policy != nullptr) {
1825
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1826
- "field:childPolicy error:Duplicate entry"));
1827
- }
1828
- grpc_error* parse_error = GRPC_ERROR_NONE;
1829
- child_policy = LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
1830
- field, &parse_error);
1831
- if (child_policy == nullptr) {
1832
- GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE);
1833
- error_list.push_back(parse_error);
1834
- }
1835
- } else if (strcmp(field->key, "fallbackPolicy") == 0) {
1836
- if (fallback_policy != nullptr) {
1837
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1838
- "field:fallbackPolicy error:Duplicate entry"));
1839
- }
1840
- grpc_error* parse_error = GRPC_ERROR_NONE;
1841
- fallback_policy = LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
1842
- field, &parse_error);
1843
- if (fallback_policy == nullptr) {
1844
- GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE);
1845
- error_list.push_back(parse_error);
1846
- }
1847
- } else if (strcmp(field->key, "edsServiceName") == 0) {
1848
- if (eds_service_name != nullptr) {
1849
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1850
- "field:edsServiceName error:Duplicate entry"));
1851
- }
1852
- if (field->type != GRPC_JSON_STRING) {
1853
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1854
- "field:edsServiceName error:type should be string"));
1855
- continue;
1856
- }
1857
- eds_service_name = field->value;
1858
- } else if (strcmp(field->key, "lrsLoadReportingServerName") == 0) {
1859
- if (lrs_load_reporting_server_name != nullptr) {
1860
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1861
- "field:lrsLoadReportingServerName error:Duplicate entry"));
1862
- }
1863
- if (field->type != GRPC_JSON_STRING) {
1864
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1865
- "field:lrsLoadReportingServerName error:type should be string"));
1866
- continue;
1867
- }
1868
- lrs_load_reporting_server_name = field->value;
1684
+ it = json.object_value().find("lrsLoadReportingServerName");
1685
+ if (it != json.object_value().end()) {
1686
+ if (it->second.type() != Json::Type::STRING) {
1687
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1688
+ "field:lrsLoadReportingServerName error:type should be string"));
1689
+ } else {
1690
+ lrs_load_reporting_server_name = it->second.string_value().c_str();
1869
1691
  }
1870
1692
  }
1871
1693
  if (error_list.empty()) {
1872
- return MakeRefCounted<ParsedXdsConfig>(
1694
+ absl::optional<std::string> optional_lrs_load_reporting_server_name;
1695
+ if (lrs_load_reporting_server_name != nullptr) {
1696
+ optional_lrs_load_reporting_server_name.emplace(
1697
+ std::string(lrs_load_reporting_server_name));
1698
+ }
1699
+ return MakeRefCounted<XdsConfig>(
1873
1700
  std::move(child_policy), std::move(fallback_policy),
1874
- grpc_core::UniquePtr<char>(gpr_strdup(eds_service_name)),
1875
- grpc_core::UniquePtr<char>(
1876
- gpr_strdup(lrs_load_reporting_server_name)));
1701
+ eds_service_name == nullptr ? "" : eds_service_name,
1702
+ std::move(optional_lrs_load_reporting_server_name));
1877
1703
  } else {
1878
1704
  *error = GRPC_ERROR_CREATE_FROM_VECTOR("Xds Parser", &error_list);
1879
1705
  return nullptr;
1880
1706
  }
1881
1707
  }
1708
+
1709
+ private:
1710
+ class XdsChildHandler : public ChildPolicyHandler {
1711
+ public:
1712
+ XdsChildHandler(Args args, TraceFlag* tracer)
1713
+ : ChildPolicyHandler(std::move(args), tracer) {}
1714
+
1715
+ bool ConfigChangeRequiresNewPolicyInstance(
1716
+ LoadBalancingPolicy::Config* old_config,
1717
+ LoadBalancingPolicy::Config* new_config) const override {
1718
+ GPR_ASSERT(old_config->name() == kXds);
1719
+ GPR_ASSERT(new_config->name() == kXds);
1720
+ XdsConfig* old_xds_config = static_cast<XdsConfig*>(old_config);
1721
+ XdsConfig* new_xds_config = static_cast<XdsConfig*>(new_config);
1722
+ const char* old_eds_service_name =
1723
+ old_xds_config->eds_service_name() == nullptr
1724
+ ? ""
1725
+ : old_xds_config->eds_service_name();
1726
+ const char* new_eds_service_name =
1727
+ new_xds_config->eds_service_name() == nullptr
1728
+ ? ""
1729
+ : new_xds_config->eds_service_name();
1730
+ return strcmp(old_eds_service_name, new_eds_service_name) != 0;
1731
+ }
1732
+
1733
+ OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
1734
+ const char* name, LoadBalancingPolicy::Args args) const override {
1735
+ return MakeOrphanable<XdsLb>(std::move(args));
1736
+ }
1737
+ };
1882
1738
  };
1883
1739
 
1884
1740
  } // namespace
@@ -1892,7 +1748,7 @@ class XdsFactory : public LoadBalancingPolicyFactory {
1892
1748
  void grpc_lb_policy_xds_init() {
1893
1749
  grpc_core::LoadBalancingPolicyRegistry::Builder::
1894
1750
  RegisterLoadBalancingPolicyFactory(
1895
- grpc_core::MakeUnique<grpc_core::XdsFactory>());
1751
+ absl::make_unique<grpc_core::XdsFactory>());
1896
1752
  }
1897
1753
 
1898
1754
  void grpc_lb_policy_xds_shutdown() {}