grpc 1.35.0 → 1.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +60 -57
  3. data/include/grpc/grpc_security.h +16 -11
  4. data/src/core/ext/filters/client_channel/client_channel.cc +32 -26
  5. data/src/core/ext/filters/client_channel/client_channel.h +0 -2
  6. data/src/core/ext/filters/client_channel/config_selector.h +1 -1
  7. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +2 -2
  8. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +3 -5
  9. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -2
  10. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -2
  11. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +1 -1
  12. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +8 -6
  13. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +289 -170
  14. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +5 -0
  15. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +1 -3
  16. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +231 -109
  17. data/src/core/ext/filters/client_channel/resolver.cc +2 -5
  18. data/src/core/ext/filters/client_channel/resolver.h +1 -12
  19. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +36 -45
  20. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +29 -41
  21. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +16 -14
  22. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +18 -15
  23. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +362 -0
  24. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -4
  25. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +22 -74
  26. data/src/core/ext/filters/client_channel/server_address.cc +6 -0
  27. data/src/core/ext/filters/client_channel/server_address.h +31 -0
  28. data/src/core/ext/filters/client_channel/subchannel.cc +2 -2
  29. data/src/core/ext/filters/max_age/max_age_filter.cc +35 -32
  30. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +1 -1
  31. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +47 -22
  32. data/src/core/ext/transport/chttp2/server/chttp2_server.h +11 -2
  33. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +11 -1
  34. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +62 -18
  35. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +0 -1
  36. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +11 -16
  37. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +42 -59
  38. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +3 -2
  39. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +15 -0
  40. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +25 -1
  41. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +75 -0
  42. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +2 -2
  43. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +9 -9
  44. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +7 -7
  45. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +28 -13
  46. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +0 -1
  47. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +11 -5
  48. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +41 -7
  49. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +0 -1
  50. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +23 -21
  51. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +122 -77
  52. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +13 -9
  53. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +37 -5
  54. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +0 -1
  55. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +11 -9
  56. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +44 -27
  57. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +42 -16
  58. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +106 -0
  59. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +0 -1
  60. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +29 -0
  61. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +67 -0
  62. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +13 -16
  63. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +51 -42
  64. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +0 -1
  65. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +16 -13
  66. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +50 -18
  67. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +4 -7
  68. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +0 -17
  69. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +0 -1
  70. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +30 -23
  71. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +85 -73
  72. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +0 -3
  73. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +0 -3
  74. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +0 -1
  75. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +0 -2
  76. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +0 -1
  77. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +21 -4
  78. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +29 -0
  79. data/src/core/ext/upb-generated/{udpa/core/v1 → xds/core/v3}/authority.upb.c +5 -5
  80. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +60 -0
  81. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +52 -0
  82. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +143 -0
  83. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +42 -0
  84. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +84 -0
  85. data/src/core/ext/upb-generated/{udpa/core/v1 → xds/core/v3}/resource.upb.c +9 -9
  86. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +94 -0
  87. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +54 -0
  88. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +166 -0
  89. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +36 -0
  90. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +85 -0
  91. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +168 -171
  92. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +405 -420
  93. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +2 -2
  94. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +12 -9
  95. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +177 -171
  96. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +10 -0
  97. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +88 -88
  98. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +153 -153
  99. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +4 -7
  100. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +33 -20
  101. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +56 -59
  102. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +116 -111
  103. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +129 -121
  104. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +21 -24
  105. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +17 -13
  106. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +747 -724
  107. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +5 -0
  108. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +22 -25
  109. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +51 -0
  110. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +35 -0
  111. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +369 -376
  112. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +12 -16
  113. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +112 -108
  114. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +45 -53
  115. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +177 -180
  116. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +92 -102
  117. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +5 -0
  118. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +32 -42
  119. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +30 -40
  120. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +4 -7
  121. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +38 -44
  122. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +30 -33
  123. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +14 -11
  124. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +42 -0
  125. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h +35 -0
  126. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +62 -0
  127. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h +40 -0
  128. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +45 -0
  129. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h +40 -0
  130. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +49 -0
  131. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h +35 -0
  132. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +67 -0
  133. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h +40 -0
  134. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +50 -0
  135. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h +35 -0
  136. data/src/core/ext/xds/xds_api.cc +738 -567
  137. data/src/core/ext/xds/xds_api.h +46 -84
  138. data/src/core/ext/xds/xds_bootstrap.cc +59 -40
  139. data/src/core/ext/xds/xds_bootstrap.h +12 -4
  140. data/src/core/ext/xds/xds_certificate_provider.cc +180 -74
  141. data/src/core/ext/xds/xds_certificate_provider.h +83 -44
  142. data/src/core/ext/xds/xds_client.cc +13 -11
  143. data/src/core/ext/xds/xds_client.h +3 -0
  144. data/src/core/ext/xds/xds_client_stats.cc +2 -1
  145. data/src/core/ext/xds/xds_server_config_fetcher.cc +147 -11
  146. data/src/core/lib/channel/handshaker.cc +2 -5
  147. data/src/core/lib/channel/handshaker.h +1 -1
  148. data/src/core/lib/gpr/log.cc +6 -1
  149. data/src/core/lib/gprpp/mpscq.cc +2 -2
  150. data/src/core/lib/gprpp/ref_counted.h +1 -1
  151. data/src/core/lib/gprpp/sync.h +129 -40
  152. data/src/core/lib/gprpp/time_util.cc +77 -0
  153. data/src/core/lib/gprpp/time_util.h +42 -0
  154. data/src/core/lib/http/httpcli_security_connector.cc +2 -2
  155. data/src/core/lib/iomgr/ev_apple.cc +10 -7
  156. data/src/core/lib/iomgr/ev_epollex_linux.cc +4 -4
  157. data/src/core/lib/iomgr/iomgr_posix.cc +0 -1
  158. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +0 -1
  159. data/src/core/lib/iomgr/sockaddr_utils.cc +1 -1
  160. data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -0
  161. data/src/core/lib/iomgr/tcp_client_posix.cc +1 -1
  162. data/src/core/lib/iomgr/tcp_posix.cc +4 -4
  163. data/src/core/lib/security/authorization/matchers.cc +339 -0
  164. data/src/core/lib/security/authorization/matchers.h +158 -0
  165. data/src/core/lib/security/authorization/mock_cel/activation.h +1 -1
  166. data/src/core/lib/security/authorization/mock_cel/cel_value.h +9 -7
  167. data/src/core/lib/security/credentials/alts/alts_credentials.cc +2 -1
  168. data/src/core/lib/security/credentials/alts/alts_credentials.h +1 -1
  169. data/src/core/lib/security/credentials/credentials.h +2 -1
  170. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +1 -1
  171. data/src/core/lib/security/credentials/external/external_account_credentials.cc +2 -2
  172. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +1 -1
  173. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +1 -1
  174. data/src/core/lib/security/credentials/fake/fake_credentials.cc +1 -1
  175. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +7 -6
  176. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +2 -2
  177. data/src/core/lib/security/credentials/jwt/json_token.cc +0 -3
  178. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +0 -3
  179. data/src/core/lib/security/credentials/local/local_credentials.cc +2 -1
  180. data/src/core/lib/security/credentials/local/local_credentials.h +1 -1
  181. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +2 -1
  182. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +1 -1
  183. data/src/core/lib/security/credentials/tls/tls_credentials.cc +2 -1
  184. data/src/core/lib/security/credentials/tls/tls_credentials.h +1 -1
  185. data/src/core/lib/security/credentials/xds/xds_credentials.cc +128 -59
  186. data/src/core/lib/security/credentials/xds/xds_credentials.h +3 -3
  187. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +5 -5
  188. data/src/core/lib/security/security_connector/ssl_utils.cc +3 -0
  189. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +26 -14
  190. data/src/core/lib/security/transport/security_handshaker.cc +1 -3
  191. data/src/core/lib/slice/slice_intern.cc +1 -1
  192. data/src/core/lib/surface/init.cc +13 -15
  193. data/src/core/lib/surface/server.cc +3 -3
  194. data/src/core/lib/surface/server.h +3 -0
  195. data/src/core/lib/surface/version.cc +2 -2
  196. data/src/core/lib/transport/metadata.cc +6 -2
  197. data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -0
  198. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +17 -20
  199. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +16 -21
  200. data/src/core/tsi/fake_transport_security.cc +1 -1
  201. data/src/core/tsi/ssl/session_cache/ssl_session.h +0 -3
  202. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +0 -2
  203. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +2 -4
  204. data/src/core/tsi/ssl_transport_security.cc +0 -3
  205. data/src/core/tsi/ssl_transport_security.h +0 -3
  206. data/src/ruby/lib/grpc/version.rb +1 -1
  207. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +7 -0
  208. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +1 -0
  209. data/third_party/boringssl-with-bazel/err_data.c +725 -723
  210. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +3 -3
  211. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +2 -2
  212. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +5 -5
  213. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +3 -10
  214. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c +3 -3
  215. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +4 -2
  216. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +2 -2
  217. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +15 -14
  218. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +30 -0
  219. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +28 -79
  220. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +39 -85
  221. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +5 -16
  222. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +10 -61
  223. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +0 -2
  224. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +2 -2
  225. data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +4 -0
  226. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +158 -0
  227. data/third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c +3 -10
  228. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +8 -9
  229. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +60 -45
  230. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c +6 -81
  231. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +87 -0
  232. data/third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-win.c +41 -0
  233. data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/dh_asn1.c +0 -0
  234. data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/params.c +179 -0
  235. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +25 -0
  236. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c +2 -17
  237. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +3 -1
  238. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn.c +13 -20
  239. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +2 -3
  240. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +9 -1
  241. data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/check.c +0 -0
  242. data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/dh.c +136 -213
  243. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +12 -0
  244. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +9 -1
  245. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +28 -0
  246. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +128 -38
  247. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +0 -7
  248. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +51 -32
  249. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +147 -0
  250. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +18 -29
  251. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +13 -4
  252. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +10 -7
  253. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c +13 -11
  254. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c +4 -0
  255. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c +34 -0
  256. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +4 -0
  257. data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +7 -13
  258. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +5 -1
  259. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +1 -1
  260. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +10 -7
  261. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c +1 -1
  262. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +8 -8
  263. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +1 -1
  264. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +29 -23
  265. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +1 -2
  266. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c +2 -2
  267. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +39 -6
  268. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +2 -2
  269. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +3 -3
  270. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +11 -10
  271. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -3
  272. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +25 -25
  273. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -2
  274. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +2 -1
  275. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +40 -20
  276. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c +3 -4
  277. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +25 -36
  278. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +1 -1
  279. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +6 -6
  280. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +6 -6
  281. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +3 -3
  282. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +652 -545
  283. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +0 -167
  284. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +10 -5
  285. data/third_party/boringssl-with-bazel/src/include/openssl/blake2.h +62 -0
  286. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +22 -7
  287. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +15 -0
  288. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +56 -26
  289. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +1 -0
  290. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +15 -0
  291. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +12 -2
  292. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +3 -0
  293. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +2 -1
  294. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +42 -24
  295. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +27 -8
  296. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +287 -98
  297. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +139 -36
  298. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +4 -3
  299. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +11 -20
  300. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +10 -5
  301. data/third_party/boringssl-with-bazel/src/ssl/internal.h +37 -16
  302. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +0 -1
  303. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +7 -8
  304. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +20 -14
  305. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +7 -8
  306. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +2 -2
  307. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +5 -7
  308. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +329 -31
  309. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +2 -2
  310. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +48 -15
  311. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +66 -24
  312. metadata +77 -65
  313. data/src/core/ext/upb-generated/udpa/core/v1/authority.upb.h +0 -60
  314. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c +0 -52
  315. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h +0 -143
  316. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c +0 -42
  317. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h +0 -84
  318. data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.h +0 -94
  319. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c +0 -54
  320. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h +0 -173
  321. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c +0 -36
  322. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h +0 -92
  323. data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c +0 -42
  324. data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h +0 -35
  325. data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c +0 -62
  326. data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h +0 -40
  327. data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c +0 -45
  328. data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h +0 -40
  329. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c +0 -49
  330. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h +0 -35
  331. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c +0 -68
  332. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h +0 -40
  333. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c +0 -51
  334. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h +0 -35
  335. data/src/core/lib/iomgr/iomgr_posix.h +0 -26
@@ -26,8 +26,6 @@
26
26
  #include "src/core/ext/filters/client_channel/resolver.h"
27
27
  #include "src/core/lib/channel/channel_stack.h"
28
28
 
29
- extern grpc_core::TraceFlag grpc_client_channel_trace;
30
-
31
29
  // Channel arg key for server URI string.
32
30
  #define GRPC_ARG_SERVER_URI "grpc.server_uri"
33
31
 
@@ -106,7 +106,7 @@ class DefaultConfigSelector : public ConfigSelector {
106
106
 
107
107
  // Only comparing the ConfigSelector itself, not the underlying
108
108
  // service config, so we always return true.
109
- bool Equals(const ConfigSelector* other) const override { return true; }
109
+ bool Equals(const ConfigSelector* /*other*/) const override { return true; }
110
110
 
111
111
  CallConfig GetCallConfig(GetCallConfigArgs args) override {
112
112
  CallConfig call_config;
@@ -151,7 +151,7 @@ void HttpConnectHandshaker::OnWriteDone(void* arg, grpc_error* error) {
151
151
  // If the write failed or we're shutting down, clean up and invoke the
152
152
  // callback with the error.
153
153
  handshaker->HandshakeFailedLocked(GRPC_ERROR_REF(error));
154
- lock.Unlock();
154
+ lock.Release();
155
155
  handshaker->Unref();
156
156
  } else {
157
157
  // Otherwise, read the response.
@@ -256,7 +256,7 @@ done:
256
256
  // Set shutdown to true so that subsequent calls to
257
257
  // http_connect_handshaker_shutdown() do nothing.
258
258
  handshaker->is_shutdown_ = true;
259
- lock.Unlock();
259
+ lock.Release();
260
260
  handshaker->Unref();
261
261
  }
262
262
 
@@ -1259,12 +1259,10 @@ ServerAddressList ExtractBalancerAddresses(const grpc_channel_args& args) {
1259
1259
  * stream for the reception of load balancing updates.
1260
1260
  *
1261
1261
  * Inputs:
1262
- * - \a addresses: corresponding to the balancers.
1263
1262
  * - \a response_generator: in order to propagate updates from the resolver
1264
1263
  * above the grpclb policy.
1265
1264
  * - \a args: other args inherited from the grpclb policy. */
1266
1265
  grpc_channel_args* BuildBalancerChannelArgs(
1267
- const ServerAddressList& addresses,
1268
1266
  FakeResolverResponseGenerator* response_generator,
1269
1267
  const grpc_channel_args* args) {
1270
1268
  // Channel args to remove.
@@ -1313,7 +1311,7 @@ grpc_channel_args* BuildBalancerChannelArgs(
1313
1311
  args, args_to_remove, GPR_ARRAY_SIZE(args_to_remove), args_to_add.data(),
1314
1312
  args_to_add.size());
1315
1313
  // Make any necessary modifications for security.
1316
- return ModifyGrpclbBalancerChannelArgs(addresses, new_args);
1314
+ return ModifyGrpclbBalancerChannelArgs(new_args);
1317
1315
  }
1318
1316
 
1319
1317
  //
@@ -1464,8 +1462,8 @@ void GrpcLb::ProcessAddressesAndChannelArgsLocked(
1464
1462
  &args, args_to_remove, GPR_ARRAY_SIZE(args_to_remove), &new_arg, 1);
1465
1463
  // Construct args for balancer channel.
1466
1464
  ServerAddressList balancer_addresses = ExtractBalancerAddresses(args);
1467
- grpc_channel_args* lb_channel_args = BuildBalancerChannelArgs(
1468
- balancer_addresses, response_generator_.get(), &args);
1465
+ grpc_channel_args* lb_channel_args =
1466
+ BuildBalancerChannelArgs(response_generator_.get(), &args);
1469
1467
  // Create balancer channel if needed.
1470
1468
  if (lb_channel_ == nullptr) {
1471
1469
  std::string uri_str = absl::StrCat("fake:///", server_name_);
@@ -33,8 +33,7 @@ namespace grpc_core {
33
33
  /// Takes ownership of \a args.
34
34
  ///
35
35
  /// Caller takes ownership of the returned args.
36
- grpc_channel_args* ModifyGrpclbBalancerChannelArgs(
37
- const ServerAddressList& addresses, grpc_channel_args* args);
36
+ grpc_channel_args* ModifyGrpclbBalancerChannelArgs(grpc_channel_args* args);
38
37
 
39
38
  grpc_channel* CreateGrpclbBalancerChannel(const char* target_uri,
40
39
  const grpc_channel_args& args);
@@ -39,8 +39,7 @@
39
39
 
40
40
  namespace grpc_core {
41
41
 
42
- grpc_channel_args* ModifyGrpclbBalancerChannelArgs(
43
- const ServerAddressList& addresses, grpc_channel_args* args) {
42
+ grpc_channel_args* ModifyGrpclbBalancerChannelArgs(grpc_channel_args* args) {
44
43
  absl::InlinedVector<const char*, 1> args_to_remove;
45
44
  absl::InlinedVector<grpc_arg, 1> args_to_add;
46
45
  // Substitute the channel credentials with a version without call
@@ -497,7 +497,7 @@ class PickFirstFactory : public LoadBalancingPolicyFactory {
497
497
  const char* name() const override { return kPickFirst; }
498
498
 
499
499
  RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
500
- const Json& json, grpc_error** /*error*/) const override {
500
+ const Json& /*json*/, grpc_error** /*error*/) const override {
501
501
  return MakeRefCounted<PickFirstConfig>();
502
502
  }
503
503
  };
@@ -363,8 +363,10 @@ void PriorityLb::HandleChildConnectivityStateChangeLocked(
363
363
  // Otherwise, find the child's priority.
364
364
  uint32_t child_priority = GetChildPriorityLocked(child->name());
365
365
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
366
- gpr_log(GPR_INFO, "[priority_lb %p] state update for priority %d, child %s",
367
- this, child_priority, child->name().c_str());
366
+ gpr_log(GPR_INFO,
367
+ "[priority_lb %p] state update for priority %u, child %s, current "
368
+ "priority %u",
369
+ this, child_priority, child->name().c_str(), current_priority_);
368
370
  }
369
371
  // Ignore priorities not in the current config.
370
372
  if (child_priority == UINT32_MAX) return;
@@ -412,12 +414,13 @@ void PriorityLb::DeleteChild(ChildPriority* child) {
412
414
  }
413
415
 
414
416
  void PriorityLb::TryNextPriorityLocked(bool report_connecting) {
417
+ current_priority_ = UINT32_MAX;
415
418
  for (uint32_t priority = 0; priority < config_->priorities().size();
416
419
  ++priority) {
417
420
  // If the child for the priority does not exist yet, create it.
418
421
  const std::string& child_name = config_->priorities()[priority];
419
422
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
420
- gpr_log(GPR_INFO, "[priority_lb %p] trying priority %d, child %s", this,
423
+ gpr_log(GPR_INFO, "[priority_lb %p] trying priority %u, child %s", this,
421
424
  priority, child_name.c_str());
422
425
  }
423
426
  auto& child = children_[child_name];
@@ -448,7 +451,7 @@ void PriorityLb::TryNextPriorityLocked(bool report_connecting) {
448
451
  if (child->failover_timer_callback_pending()) {
449
452
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
450
453
  gpr_log(GPR_INFO,
451
- "[priority_lb %p] priority %d, child %s: child still "
454
+ "[priority_lb %p] priority %u, child %s: child still "
452
455
  "attempting to connect, will wait",
453
456
  this, priority, child_name.c_str());
454
457
  }
@@ -468,7 +471,6 @@ void PriorityLb::TryNextPriorityLocked(bool report_connecting) {
468
471
  "TRANSIENT_FAILURE",
469
472
  this);
470
473
  }
471
- current_priority_ = UINT32_MAX;
472
474
  current_child_from_before_update_ = nullptr;
473
475
  grpc_error* error = grpc_error_set_int(
474
476
  GRPC_ERROR_CREATE_FROM_STATIC_STRING("no ready priority"),
@@ -480,7 +482,7 @@ void PriorityLb::TryNextPriorityLocked(bool report_connecting) {
480
482
 
481
483
  void PriorityLb::SelectPriorityLocked(uint32_t priority) {
482
484
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
483
- gpr_log(GPR_INFO, "[priority_lb %p] selected priority %d, child %s", this,
485
+ gpr_log(GPR_INFO, "[priority_lb %p] selected priority %u, child %s", this,
484
486
  priority, config_->priorities()[priority].c_str());
485
487
  }
486
488
  current_priority_ = priority;
@@ -63,26 +63,31 @@ class CdsLb : public LoadBalancingPolicy {
63
63
 
64
64
  void UpdateLocked(UpdateArgs args) override;
65
65
  void ResetBackoffLocked() override;
66
+ void ExitIdleLocked() override;
66
67
 
67
68
  private:
68
69
  // Watcher for getting cluster data from XdsClient.
69
70
  class ClusterWatcher : public XdsClient::ClusterWatcherInterface {
70
71
  public:
71
- explicit ClusterWatcher(RefCountedPtr<CdsLb> parent)
72
- : parent_(std::move(parent)) {}
72
+ ClusterWatcher(RefCountedPtr<CdsLb> parent, std::string name)
73
+ : parent_(std::move(parent)), name_(std::move(name)) {}
73
74
 
74
75
  void OnClusterChanged(XdsApi::CdsUpdate cluster_data) override {
75
- new Notifier(parent_, std::move(cluster_data));
76
+ new Notifier(parent_, name_, std::move(cluster_data));
76
77
  }
77
- void OnError(grpc_error* error) override { new Notifier(parent_, error); }
78
- void OnResourceDoesNotExist() override { new Notifier(parent_); }
78
+ void OnError(grpc_error* error) override {
79
+ new Notifier(parent_, name_, error);
80
+ }
81
+ void OnResourceDoesNotExist() override { new Notifier(parent_, name_); }
79
82
 
80
83
  private:
81
84
  class Notifier {
82
85
  public:
83
- Notifier(RefCountedPtr<CdsLb> parent, XdsApi::CdsUpdate update);
84
- Notifier(RefCountedPtr<CdsLb> parent, grpc_error* error);
85
- explicit Notifier(RefCountedPtr<CdsLb> parent);
86
+ Notifier(RefCountedPtr<CdsLb> parent, std::string name,
87
+ XdsApi::CdsUpdate update);
88
+ Notifier(RefCountedPtr<CdsLb> parent, std::string name,
89
+ grpc_error* error);
90
+ explicit Notifier(RefCountedPtr<CdsLb> parent, std::string name);
86
91
 
87
92
  private:
88
93
  enum Type { kUpdate, kError, kDoesNotExist };
@@ -91,12 +96,22 @@ class CdsLb : public LoadBalancingPolicy {
91
96
  void RunInWorkSerializer(grpc_error* error);
92
97
 
93
98
  RefCountedPtr<CdsLb> parent_;
99
+ std::string name_;
94
100
  grpc_closure closure_;
95
101
  XdsApi::CdsUpdate update_;
96
102
  Type type_;
97
103
  };
98
104
 
99
105
  RefCountedPtr<CdsLb> parent_;
106
+ std::string name_;
107
+ };
108
+
109
+ struct WatcherState {
110
+ // Pointer to watcher, to be used when cancelling.
111
+ // Not owned, so do not dereference.
112
+ ClusterWatcher* watcher = nullptr;
113
+ // Most recent update obtained from this watcher.
114
+ absl::optional<XdsApi::CdsUpdate> update;
100
115
  };
101
116
 
102
117
  // Delegating helper to be passed to child policy.
@@ -119,12 +134,20 @@ class CdsLb : public LoadBalancingPolicy {
119
134
 
120
135
  void ShutdownLocked() override;
121
136
 
122
- void OnClusterChanged(XdsApi::CdsUpdate cluster_data);
123
- void OnError(grpc_error* error);
124
- void OnResourceDoesNotExist();
137
+ bool GenerateDiscoveryMechanismForCluster(
138
+ const std::string& name, Json::Array* discovery_mechanisms,
139
+ std::set<std::string>* clusters_needed);
140
+ void OnClusterChanged(const std::string& name,
141
+ XdsApi::CdsUpdate cluster_data);
142
+ void OnError(const std::string& name, grpc_error* error);
143
+ void OnResourceDoesNotExist(const std::string& name);
125
144
 
126
145
  grpc_error* UpdateXdsCertificateProvider(
127
- const XdsApi::CdsUpdate& cluster_data);
146
+ const std::string& cluster_name, const XdsApi::CdsUpdate& cluster_data);
147
+
148
+ void CancelClusterDataWatch(absl::string_view cluster_name,
149
+ XdsClient::ClusterWatcherInterface* watcher,
150
+ bool delay_unsubscription = false);
128
151
 
129
152
  void MaybeDestroyChildPolicyLocked();
130
153
 
@@ -135,9 +158,10 @@ class CdsLb : public LoadBalancingPolicy {
135
158
 
136
159
  // The xds client.
137
160
  RefCountedPtr<XdsClient> xds_client_;
138
- // A pointer to the cluster watcher, to be used when cancelling the watch.
139
- // Note that this is not owned, so this pointer must never be derefernced.
140
- ClusterWatcher* cluster_watcher_ = nullptr;
161
+
162
+ // Maps from cluster name to the state for that cluster.
163
+ // The root of the tree is config_->cluster().
164
+ std::map<std::string, WatcherState> watchers_;
141
165
 
142
166
  RefCountedPtr<grpc_tls_certificate_provider> root_certificate_provider_;
143
167
  RefCountedPtr<grpc_tls_certificate_provider> identity_certificate_provider_;
@@ -155,21 +179,26 @@ class CdsLb : public LoadBalancingPolicy {
155
179
  //
156
180
 
157
181
  CdsLb::ClusterWatcher::Notifier::Notifier(RefCountedPtr<CdsLb> parent,
182
+ std::string name,
158
183
  XdsApi::CdsUpdate update)
159
- : parent_(std::move(parent)), update_(std::move(update)), type_(kUpdate) {
184
+ : parent_(std::move(parent)),
185
+ name_(std::move(name)),
186
+ update_(std::move(update)),
187
+ type_(kUpdate) {
160
188
  GRPC_CLOSURE_INIT(&closure_, &RunInExecCtx, this, nullptr);
161
189
  ExecCtx::Run(DEBUG_LOCATION, &closure_, GRPC_ERROR_NONE);
162
190
  }
163
191
 
164
192
  CdsLb::ClusterWatcher::Notifier::Notifier(RefCountedPtr<CdsLb> parent,
165
- grpc_error* error)
166
- : parent_(std::move(parent)), type_(kError) {
193
+ std::string name, grpc_error* error)
194
+ : parent_(std::move(parent)), name_(std::move(name)), type_(kError) {
167
195
  GRPC_CLOSURE_INIT(&closure_, &RunInExecCtx, this, nullptr);
168
196
  ExecCtx::Run(DEBUG_LOCATION, &closure_, error);
169
197
  }
170
198
 
171
- CdsLb::ClusterWatcher::Notifier::Notifier(RefCountedPtr<CdsLb> parent)
172
- : parent_(std::move(parent)), type_(kDoesNotExist) {
199
+ CdsLb::ClusterWatcher::Notifier::Notifier(RefCountedPtr<CdsLb> parent,
200
+ std::string name)
201
+ : parent_(std::move(parent)), name_(std::move(name)), type_(kDoesNotExist) {
173
202
  GRPC_CLOSURE_INIT(&closure_, &RunInExecCtx, this, nullptr);
174
203
  ExecCtx::Run(DEBUG_LOCATION, &closure_, GRPC_ERROR_NONE);
175
204
  }
@@ -185,13 +214,13 @@ void CdsLb::ClusterWatcher::Notifier::RunInExecCtx(void* arg,
185
214
  void CdsLb::ClusterWatcher::Notifier::RunInWorkSerializer(grpc_error* error) {
186
215
  switch (type_) {
187
216
  case kUpdate:
188
- parent_->OnClusterChanged(std::move(update_));
217
+ parent_->OnClusterChanged(name_, std::move(update_));
189
218
  break;
190
219
  case kError:
191
- parent_->OnError(error);
220
+ parent_->OnError(name_, error);
192
221
  break;
193
222
  case kDoesNotExist:
194
- parent_->OnResourceDoesNotExist();
223
+ parent_->OnResourceDoesNotExist(name_);
195
224
  break;
196
225
  };
197
226
  delete this;
@@ -261,13 +290,15 @@ void CdsLb::ShutdownLocked() {
261
290
  shutting_down_ = true;
262
291
  MaybeDestroyChildPolicyLocked();
263
292
  if (xds_client_ != nullptr) {
264
- if (cluster_watcher_ != nullptr) {
293
+ for (auto& watcher : watchers_) {
265
294
  if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
266
295
  gpr_log(GPR_INFO, "[cdslb %p] cancelling watch for cluster %s", this,
267
- config_->cluster().c_str());
296
+ watcher.first.c_str());
268
297
  }
269
- xds_client_->CancelClusterDataWatch(config_->cluster(), cluster_watcher_);
298
+ CancelClusterDataWatch(watcher.first, watcher.second.watcher,
299
+ /*delay_unsubscription=*/false);
270
300
  }
301
+ watchers_.clear();
271
302
  xds_client_.reset(DEBUG_LOCATION, "CdsLb");
272
303
  }
273
304
  grpc_channel_args_destroy(args_);
@@ -286,6 +317,10 @@ void CdsLb::ResetBackoffLocked() {
286
317
  if (child_policy_ != nullptr) child_policy_->ResetBackoffLocked();
287
318
  }
288
319
 
320
+ void CdsLb::ExitIdleLocked() {
321
+ if (child_policy_ != nullptr) child_policy_->ExitIdleLocked();
322
+ }
323
+
289
324
  void CdsLb::UpdateLocked(UpdateArgs args) {
290
325
  // Update config.
291
326
  auto old_config = std::move(config_);
@@ -301,119 +336,214 @@ void CdsLb::UpdateLocked(UpdateArgs args) {
301
336
  // If cluster name changed, cancel watcher and restart.
302
337
  if (old_config == nullptr || old_config->cluster() != config_->cluster()) {
303
338
  if (old_config != nullptr) {
304
- if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
305
- gpr_log(GPR_INFO, "[cdslb %p] cancelling watch for cluster %s", this,
306
- old_config->cluster().c_str());
339
+ for (auto& watcher : watchers_) {
340
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
341
+ gpr_log(GPR_INFO, "[cdslb %p] cancelling watch for cluster %s", this,
342
+ watcher.first.c_str());
343
+ }
344
+ CancelClusterDataWatch(watcher.first, watcher.second.watcher,
345
+ /*delay_unsubscription=*/true);
307
346
  }
308
- xds_client_->CancelClusterDataWatch(old_config->cluster(),
309
- cluster_watcher_,
310
- /*delay_unsubscription=*/true);
347
+ watchers_.clear();
311
348
  }
312
- if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
313
- gpr_log(GPR_INFO, "[cdslb %p] starting watch for cluster %s", this,
314
- config_->cluster().c_str());
315
- }
316
- auto watcher = absl::make_unique<ClusterWatcher>(Ref());
317
- cluster_watcher_ = watcher.get();
349
+ auto watcher = absl::make_unique<ClusterWatcher>(Ref(), config_->cluster());
350
+ watchers_[config_->cluster()].watcher = watcher.get();
318
351
  xds_client_->WatchClusterData(config_->cluster(), std::move(watcher));
319
352
  }
320
353
  }
321
354
 
322
- void CdsLb::OnClusterChanged(XdsApi::CdsUpdate cluster_data) {
323
- if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
324
- gpr_log(GPR_INFO, "[cdslb %p] received CDS update from xds client %p: %s",
325
- this, xds_client_.get(), cluster_data.ToString().c_str());
355
+ // This method will attempt to generate one or multiple entries of discovery
356
+ // mechanism recursively:
357
+ // For cluster types EDS or LOGICAL_DNS, one discovery mechanism entry may be
358
+ // generated cluster name, type and other data from the CdsUpdate inserted into
359
+ // the entry and the entry appended to the array of entries.
360
+ // Note, discovery mechanism entry can be generated if an CdsUpdate is
361
+ // available; otherwise, just return false. For cluster type AGGREGATE,
362
+ // recursively call the method for each child cluster.
363
+ bool CdsLb::GenerateDiscoveryMechanismForCluster(
364
+ const std::string& name, Json::Array* discovery_mechanisms,
365
+ std::set<std::string>* clusters_needed) {
366
+ clusters_needed->insert(name);
367
+ auto& state = watchers_[name];
368
+ // Create a new watcher if needed.
369
+ if (state.watcher == nullptr) {
370
+ auto watcher = absl::make_unique<ClusterWatcher>(Ref(), name);
371
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
372
+ gpr_log(GPR_INFO, "[cdslb %p] starting watch for cluster %s", this,
373
+ name.c_str());
374
+ }
375
+ state.watcher = watcher.get();
376
+ xds_client_->WatchClusterData(name, std::move(watcher));
377
+ return false;
326
378
  }
327
- grpc_error* error = GRPC_ERROR_NONE;
328
- error = UpdateXdsCertificateProvider(cluster_data);
329
- if (error != GRPC_ERROR_NONE) {
330
- return OnError(error);
379
+ // Don't have the update we need yet.
380
+ if (!state.update.has_value()) return false;
381
+ // For AGGREGATE clusters, recursively expand to child clusters.
382
+ if (state.update->cluster_type == XdsApi::CdsUpdate::ClusterType::AGGREGATE) {
383
+ bool missing_cluster = false;
384
+ for (const std::string& child_name :
385
+ state.update->prioritized_cluster_names) {
386
+ if (!GenerateDiscoveryMechanismForCluster(
387
+ child_name, discovery_mechanisms, clusters_needed)) {
388
+ missing_cluster = true;
389
+ }
390
+ }
391
+ return !missing_cluster;
392
+ }
393
+ std::string type;
394
+ switch (state.update->cluster_type) {
395
+ case XdsApi::CdsUpdate::ClusterType::EDS:
396
+ type = "EDS";
397
+ break;
398
+ case XdsApi::CdsUpdate::ClusterType::LOGICAL_DNS:
399
+ type = "LOGICAL_DNS";
400
+ break;
401
+ default:
402
+ GPR_ASSERT(0);
403
+ break;
331
404
  }
332
- // Construct config for child policy.
333
- Json::Object discovery_mechanism = {
334
- {"clusterName", config_->cluster()},
335
- {"max_concurrent_requests", cluster_data.max_concurrent_requests},
336
- {"type", "EDS"},
405
+ Json::Object mechanism = {
406
+ {"clusterName", name},
407
+ {"max_concurrent_requests", state.update->max_concurrent_requests},
408
+ {"type", std::move(type)},
337
409
  };
338
- if (!cluster_data.eds_service_name.empty()) {
339
- discovery_mechanism["edsServiceName"] = cluster_data.eds_service_name;
410
+ if (!state.update->eds_service_name.empty()) {
411
+ mechanism["edsServiceName"] = state.update->eds_service_name;
340
412
  }
341
- if (cluster_data.lrs_load_reporting_server_name.has_value()) {
342
- discovery_mechanism["lrsLoadReportingServerName"] =
343
- cluster_data.lrs_load_reporting_server_name.value();
413
+ if (state.update->lrs_load_reporting_server_name.has_value()) {
414
+ mechanism["lrsLoadReportingServerName"] =
415
+ state.update->lrs_load_reporting_server_name.value();
344
416
  }
345
- Json::Object child_config = {
346
- {"discoveryMechanisms",
347
- Json::Array{
348
- discovery_mechanism,
349
- }},
350
- {"localityPickingPolicy",
351
- Json::Array{
352
- Json::Object{
353
- {"weighted_target_experimental",
354
- Json::Object{
355
- {"targets", Json::Object()},
356
- }},
357
- },
358
- }},
359
- {"endpointPickingPolicy",
360
- Json::Array{
361
- Json::Object{
362
- {"round_robin", Json::Object()},
363
- },
364
- }},
365
- };
366
- Json json = Json::Array{
367
- Json::Object{
368
- {"xds_cluster_resolver_experimental", std::move(child_config)},
369
- },
370
- };
417
+ discovery_mechanisms->emplace_back(std::move(mechanism));
418
+ return true;
419
+ }
420
+
421
+ void CdsLb::OnClusterChanged(const std::string& name,
422
+ XdsApi::CdsUpdate cluster_data) {
371
423
  if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
372
- std::string json_str = json.Dump(/*indent=*/1);
373
- gpr_log(GPR_INFO, "[cdslb %p] generated config for child policy: %s", this,
374
- json_str.c_str());
424
+ gpr_log(
425
+ GPR_INFO,
426
+ "[cdslb %p] received CDS update for cluster %s from xds client %p: %s",
427
+ this, name.c_str(), xds_client_.get(), cluster_data.ToString().c_str());
375
428
  }
376
- RefCountedPtr<LoadBalancingPolicy::Config> config =
377
- LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(json, &error);
429
+ // Store the update in the map if we are still interested in watching this
430
+ // cluster (i.e., it is not cancelled already).
431
+ // If we've already deleted this entry, then this is an update notification
432
+ // that was scheduled before the deletion, so we can just ignore it.
433
+ auto it = watchers_.find(name);
434
+ if (it == watchers_.end()) return;
435
+ it->second.update = cluster_data;
436
+ // Take care of integration with new certificate code.
437
+ grpc_error* error = GRPC_ERROR_NONE;
438
+ error = UpdateXdsCertificateProvider(name, it->second.update.value());
378
439
  if (error != GRPC_ERROR_NONE) {
379
- OnError(error);
380
- return;
440
+ return OnError(name, error);
381
441
  }
382
- // Create child policy if not already present.
383
- if (child_policy_ == nullptr) {
384
- LoadBalancingPolicy::Args args;
385
- args.work_serializer = work_serializer();
386
- args.args = args_;
387
- args.channel_control_helper = absl::make_unique<Helper>(Ref());
388
- child_policy_ = LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy(
389
- config->name(), std::move(args));
390
- if (child_policy_ == nullptr) {
391
- OnError(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
392
- "failed to create child policy"));
393
- return;
442
+ // Scan the map starting from the root cluster to generate the list of
443
+ // discovery mechanisms. If we don't have some of the data we need (i.e., we
444
+ // just started up and not all watchers have returned data yet), then don't
445
+ // update the child policy at all.
446
+ Json::Array discovery_mechanisms;
447
+ std::set<std::string> clusters_needed;
448
+ if (GenerateDiscoveryMechanismForCluster(
449
+ config_->cluster(), &discovery_mechanisms, &clusters_needed)) {
450
+ // Construct config for child policy.
451
+ Json::Object xds_lb_policy;
452
+ if (cluster_data.lb_policy == "RING_HASH") {
453
+ std::string hash_function;
454
+ switch (cluster_data.hash_function) {
455
+ case XdsApi::CdsUpdate::HashFunction::XX_HASH:
456
+ hash_function = "XX_HASH";
457
+ break;
458
+ case XdsApi::CdsUpdate::HashFunction::MURMUR_HASH_2:
459
+ hash_function = "MURMUR_HASH_2";
460
+ break;
461
+ default:
462
+ GPR_ASSERT(0);
463
+ break;
464
+ }
465
+ xds_lb_policy["RING_HASH"] = Json::Object{
466
+ {"min_ring_size", cluster_data.min_ring_size},
467
+ {"max_ring_size", cluster_data.max_ring_size},
468
+ {"hash_function", hash_function},
469
+ };
470
+ } else {
471
+ xds_lb_policy["ROUND_ROBIN"] = Json::Object();
394
472
  }
395
- grpc_pollset_set_add_pollset_set(child_policy_->interested_parties(),
396
- interested_parties());
473
+ Json::Object child_config = {
474
+ {"xdsLbPolicy",
475
+ Json::Array{
476
+ xds_lb_policy,
477
+ }},
478
+ {"discoveryMechanisms", std::move(discovery_mechanisms)},
479
+ };
480
+ Json json = Json::Array{
481
+ Json::Object{
482
+ {"xds_cluster_resolver_experimental", std::move(child_config)},
483
+ },
484
+ };
397
485
  if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
398
- gpr_log(GPR_INFO, "[cdslb %p] created child policy %s (%p)", this,
399
- config->name(), child_policy_.get());
486
+ std::string json_str = json.Dump(/*indent=*/1);
487
+ gpr_log(GPR_INFO, "[cdslb %p] generated config for child policy: %s",
488
+ this, json_str.c_str());
400
489
  }
490
+ RefCountedPtr<LoadBalancingPolicy::Config> config =
491
+ LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(json, &error);
492
+ if (error != GRPC_ERROR_NONE) {
493
+ OnError(name, error);
494
+ return;
495
+ }
496
+ // Create child policy if not already present.
497
+ if (child_policy_ == nullptr) {
498
+ LoadBalancingPolicy::Args args;
499
+ args.work_serializer = work_serializer();
500
+ args.args = args_;
501
+ args.channel_control_helper = absl::make_unique<Helper>(Ref());
502
+ child_policy_ = LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy(
503
+ config->name(), std::move(args));
504
+ if (child_policy_ == nullptr) {
505
+ OnError(name, GRPC_ERROR_CREATE_FROM_STATIC_STRING(
506
+ "failed to create child policy"));
507
+ return;
508
+ }
509
+ grpc_pollset_set_add_pollset_set(child_policy_->interested_parties(),
510
+ interested_parties());
511
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
512
+ gpr_log(GPR_INFO, "[cdslb %p] created child policy %s (%p)", this,
513
+ config->name(), child_policy_.get());
514
+ }
515
+ }
516
+ // Update child policy.
517
+ UpdateArgs args;
518
+ args.config = std::move(config);
519
+ if (xds_certificate_provider_ != nullptr) {
520
+ grpc_arg arg_to_add = xds_certificate_provider_->MakeChannelArg();
521
+ args.args = grpc_channel_args_copy_and_add(args_, &arg_to_add, 1);
522
+ } else {
523
+ args.args = grpc_channel_args_copy(args_);
524
+ }
525
+ child_policy_->UpdateLocked(std::move(args));
401
526
  }
402
- // Update child policy.
403
- UpdateArgs args;
404
- args.config = std::move(config);
405
- if (xds_certificate_provider_ != nullptr) {
406
- grpc_arg arg_to_add = xds_certificate_provider_->MakeChannelArg();
407
- args.args = grpc_channel_args_copy_and_add(args_, &arg_to_add, 1);
408
- } else {
409
- args.args = grpc_channel_args_copy(args_);
527
+ // Remove entries in watchers_ for any clusters not in clusters_needed
528
+ for (auto it = watchers_.begin(); it != watchers_.end();) {
529
+ const std::string& cluster_name = it->first;
530
+ if (clusters_needed.find(cluster_name) != clusters_needed.end()) {
531
+ ++it;
532
+ continue;
533
+ }
534
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
535
+ gpr_log(GPR_INFO, "[cdslb %p] cancelling watch for cluster %s", this,
536
+ cluster_name.c_str());
537
+ }
538
+ CancelClusterDataWatch(cluster_name, it->second.watcher,
539
+ /*delay_unsubscription=*/false);
540
+ it = watchers_.erase(it);
410
541
  }
411
- child_policy_->UpdateLocked(std::move(args));
412
542
  }
413
543
 
414
- void CdsLb::OnError(grpc_error* error) {
544
+ void CdsLb::OnError(const std::string& name, grpc_error* error) {
415
545
  gpr_log(GPR_ERROR, "[cdslb %p] xds error obtaining data for cluster %s: %s",
416
- this, config_->cluster().c_str(), grpc_error_string(error));
546
+ this, name.c_str(), grpc_error_string(error));
417
547
  // Go into TRANSIENT_FAILURE if we have not yet created the child
418
548
  // policy (i.e., we have not yet received data from xds). Otherwise,
419
549
  // we keep running with the data we had previously.
@@ -426,11 +556,11 @@ void CdsLb::OnError(grpc_error* error) {
426
556
  }
427
557
  }
428
558
 
429
- void CdsLb::OnResourceDoesNotExist() {
559
+ void CdsLb::OnResourceDoesNotExist(const std::string& name) {
430
560
  gpr_log(GPR_ERROR,
431
561
  "[cdslb %p] CDS resource for %s does not exist -- reporting "
432
562
  "TRANSIENT_FAILURE",
433
- this, config_->cluster().c_str());
563
+ this, name.c_str());
434
564
  grpc_error* error =
435
565
  grpc_error_set_int(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
436
566
  absl::StrCat("CDS resource \"", config_->cluster(),
@@ -444,7 +574,7 @@ void CdsLb::OnResourceDoesNotExist() {
444
574
  }
445
575
 
446
576
  grpc_error* CdsLb::UpdateXdsCertificateProvider(
447
- const XdsApi::CdsUpdate& cluster_data) {
577
+ const std::string& cluster_name, const XdsApi::CdsUpdate& cluster_data) {
448
578
  // Early out if channel is not configured to use xds security.
449
579
  grpc_channel_credentials* channel_credentials =
450
580
  grpc_channel_credentials_find_in_args(args_);
@@ -453,18 +583,16 @@ grpc_error* CdsLb::UpdateXdsCertificateProvider(
453
583
  xds_certificate_provider_ = nullptr;
454
584
  return GRPC_ERROR_NONE;
455
585
  }
586
+ if (xds_certificate_provider_ == nullptr) {
587
+ xds_certificate_provider_ = MakeRefCounted<XdsCertificateProvider>();
588
+ }
589
+ // Configure root cert.
456
590
  absl::string_view root_provider_instance_name =
457
591
  cluster_data.common_tls_context.combined_validation_context
458
592
  .validation_context_certificate_provider_instance.instance_name;
459
593
  absl::string_view root_provider_cert_name =
460
594
  cluster_data.common_tls_context.combined_validation_context
461
595
  .validation_context_certificate_provider_instance.certificate_name;
462
- absl::string_view identity_provider_instance_name =
463
- cluster_data.common_tls_context
464
- .tls_certificate_certificate_provider_instance.instance_name;
465
- absl::string_view identity_provider_cert_name =
466
- cluster_data.common_tls_context
467
- .tls_certificate_certificate_provider_instance.certificate_name;
468
596
  RefCountedPtr<XdsCertificateProvider> new_root_provider;
469
597
  if (!root_provider_instance_name.empty()) {
470
598
  new_root_provider =
@@ -491,6 +619,18 @@ grpc_error* CdsLb::UpdateXdsCertificateProvider(
491
619
  }
492
620
  root_certificate_provider_ = std::move(new_root_provider);
493
621
  }
622
+ xds_certificate_provider_->UpdateRootCertNameAndDistributor(
623
+ cluster_name, root_provider_cert_name,
624
+ root_certificate_provider_ == nullptr
625
+ ? nullptr
626
+ : root_certificate_provider_->distributor());
627
+ // Configure identity cert.
628
+ absl::string_view identity_provider_instance_name =
629
+ cluster_data.common_tls_context
630
+ .tls_certificate_certificate_provider_instance.instance_name;
631
+ absl::string_view identity_provider_cert_name =
632
+ cluster_data.common_tls_context
633
+ .tls_certificate_certificate_provider_instance.certificate_name;
494
634
  RefCountedPtr<XdsCertificateProvider> new_identity_provider;
495
635
  if (!identity_provider_instance_name.empty()) {
496
636
  new_identity_provider =
@@ -517,56 +657,34 @@ grpc_error* CdsLb::UpdateXdsCertificateProvider(
517
657
  }
518
658
  identity_certificate_provider_ = std::move(new_identity_provider);
519
659
  }
520
- const std::vector<XdsApi::StringMatcher>& match_subject_alt_names =
660
+ xds_certificate_provider_->UpdateIdentityCertNameAndDistributor(
661
+ cluster_name, identity_provider_cert_name,
662
+ identity_certificate_provider_ == nullptr
663
+ ? nullptr
664
+ : identity_certificate_provider_->distributor());
665
+ // Configure SAN matchers.
666
+ const std::vector<StringMatcher>& match_subject_alt_names =
521
667
  cluster_data.common_tls_context.combined_validation_context
522
668
  .default_validation_context.match_subject_alt_names;
523
- if (!root_provider_instance_name.empty() &&
524
- !identity_provider_instance_name.empty()) {
525
- // Using mTLS configuration
526
- if (xds_certificate_provider_ != nullptr &&
527
- xds_certificate_provider_->ProvidesRootCerts() &&
528
- xds_certificate_provider_->ProvidesIdentityCerts()) {
529
- xds_certificate_provider_->UpdateRootCertNameAndDistributor(
530
- root_provider_cert_name, root_certificate_provider_->distributor());
531
- xds_certificate_provider_->UpdateIdentityCertNameAndDistributor(
532
- identity_provider_cert_name,
533
- identity_certificate_provider_->distributor());
534
- xds_certificate_provider_->UpdateSubjectAlternativeNameMatchers(
535
- match_subject_alt_names);
536
- } else {
537
- // Existing xDS certificate provider does not have mTLS configuration.
538
- // Create new certificate provider so that new subchannel connectors are
539
- // created.
540
- xds_certificate_provider_ = MakeRefCounted<XdsCertificateProvider>(
541
- root_provider_cert_name, root_certificate_provider_->distributor(),
542
- identity_provider_cert_name,
543
- identity_certificate_provider_->distributor(),
544
- match_subject_alt_names);
545
- }
546
- } else if (!root_provider_instance_name.empty()) {
547
- // Using TLS configuration
548
- if (xds_certificate_provider_ != nullptr &&
549
- xds_certificate_provider_->ProvidesRootCerts() &&
550
- !xds_certificate_provider_->ProvidesIdentityCerts()) {
551
- xds_certificate_provider_->UpdateRootCertNameAndDistributor(
552
- root_provider_cert_name, root_certificate_provider_->distributor());
553
- xds_certificate_provider_->UpdateSubjectAlternativeNameMatchers(
554
- match_subject_alt_names);
555
- } else {
556
- // Existing xDS certificate provider does not have TLS configuration.
557
- // Create new certificate provider so that new subchannel connectors are
558
- // created.
559
- xds_certificate_provider_ = MakeRefCounted<XdsCertificateProvider>(
560
- root_provider_cert_name, root_certificate_provider_->distributor(),
561
- "", nullptr, match_subject_alt_names);
562
- }
563
- } else {
564
- // No configuration provided.
565
- xds_certificate_provider_ = nullptr;
566
- }
669
+ xds_certificate_provider_->UpdateSubjectAlternativeNameMatchers(
670
+ cluster_name, match_subject_alt_names);
567
671
  return GRPC_ERROR_NONE;
568
672
  }
569
673
 
674
+ void CdsLb::CancelClusterDataWatch(absl::string_view cluster_name,
675
+ XdsClient::ClusterWatcherInterface* watcher,
676
+ bool delay_unsubscription) {
677
+ if (xds_certificate_provider_ != nullptr) {
678
+ std::string name(cluster_name);
679
+ xds_certificate_provider_->UpdateRootCertNameAndDistributor(name, "",
680
+ nullptr);
681
+ xds_certificate_provider_->UpdateIdentityCertNameAndDistributor(name, "",
682
+ nullptr);
683
+ xds_certificate_provider_->UpdateSubjectAlternativeNameMatchers(name, {});
684
+ }
685
+ xds_client_->CancelClusterDataWatch(cluster_name, watcher,
686
+ delay_unsubscription);
687
+ }
570
688
  //
571
689
  // factory
572
690
  //
@@ -601,6 +719,7 @@ class CdsLbFactory : public LoadBalancingPolicyFactory {
601
719
  return nullptr;
602
720
  }
603
721
  std::vector<grpc_error*> error_list;
722
+ // cluster name.
604
723
  std::string cluster;
605
724
  auto it = json.object_value().find("cluster");
606
725
  if (it == json.object_value().end()) {