grpc 1.26.0 → 1.30.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 (1240) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +7860 -11139
  3. data/etc/roots.pem +44 -0
  4. data/include/grpc/grpc.h +2 -2
  5. data/include/grpc/grpc_security.h +59 -24
  6. data/include/grpc/grpc_security_constants.h +28 -0
  7. data/include/grpc/impl/codegen/grpc_types.h +38 -21
  8. data/include/grpc/impl/codegen/port_platform.h +14 -3
  9. data/include/grpc/impl/codegen/sync.h +5 -3
  10. data/include/grpc/impl/codegen/sync_abseil.h +36 -0
  11. data/include/grpc/module.modulemap +25 -37
  12. data/include/grpc/support/sync_abseil.h +26 -0
  13. data/src/core/ext/filters/client_channel/backend_metric.cc +7 -4
  14. data/src/core/ext/filters/client_channel/client_channel.cc +273 -264
  15. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +31 -47
  16. data/src/core/ext/filters/client_channel/client_channel_channelz.h +1 -3
  17. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +3 -2
  18. data/src/core/ext/filters/client_channel/health/health_check_client.cc +7 -22
  19. data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
  20. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
  21. data/src/core/ext/filters/client_channel/http_proxy.cc +25 -15
  22. data/src/core/ext/filters/client_channel/lb_policy.cc +20 -18
  23. data/src/core/ext/filters/client_channel/lb_policy.h +42 -33
  24. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +83 -0
  25. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +99 -0
  26. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +297 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +83 -0
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +423 -627
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +89 -0
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +40 -0
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +11 -9
  32. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +3 -2
  33. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +88 -121
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +28 -57
  35. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +18 -21
  36. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +871 -0
  37. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +10 -14
  38. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +5 -11
  39. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +734 -0
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +150 -101
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +938 -0
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +528 -0
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -2
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +834 -0
  45. data/src/core/ext/filters/client_channel/lb_policy_factory.h +3 -3
  46. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +49 -77
  47. data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -1
  48. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +2 -1
  49. data/src/core/ext/filters/client_channel/parse_address.cc +22 -21
  50. data/src/core/ext/filters/client_channel/resolver.cc +5 -8
  51. data/src/core/ext/filters/client_channel/resolver.h +12 -14
  52. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +129 -128
  53. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +35 -35
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +8 -7
  55. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +17 -21
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +5 -5
  57. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +72 -117
  58. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +186 -135
  59. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -3
  60. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +7 -4
  61. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +42 -45
  62. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +94 -103
  63. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +0 -4
  64. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +5 -5
  65. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +61 -10
  66. data/src/core/ext/filters/client_channel/resolver_factory.h +2 -2
  67. data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -3
  68. data/src/core/ext/filters/client_channel/resolver_registry.h +8 -8
  69. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +242 -300
  70. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +21 -18
  71. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +56 -206
  72. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +11 -14
  73. data/src/core/ext/filters/client_channel/server_address.cc +6 -9
  74. data/src/core/ext/filters/client_channel/server_address.h +6 -12
  75. data/src/core/ext/filters/client_channel/service_config.cc +144 -253
  76. data/src/core/ext/filters/client_channel/service_config.h +32 -109
  77. data/src/core/ext/filters/client_channel/service_config_call_data.h +68 -0
  78. data/src/core/ext/filters/client_channel/service_config_parser.cc +87 -0
  79. data/src/core/ext/filters/client_channel/service_config_parser.h +89 -0
  80. data/src/core/ext/filters/client_channel/subchannel.cc +54 -24
  81. data/src/core/ext/filters/client_channel/subchannel.h +35 -11
  82. data/src/core/ext/filters/client_channel/xds/xds_api.cc +1556 -232
  83. data/src/core/ext/filters/client_channel/xds/xds_api.h +213 -114
  84. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +237 -345
  85. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +34 -46
  86. data/src/core/ext/filters/client_channel/xds/xds_channel.h +3 -1
  87. data/src/core/ext/filters/client_channel/xds/xds_channel_secure.cc +18 -11
  88. data/src/core/ext/filters/client_channel/xds/xds_client.cc +1326 -399
  89. data/src/core/ext/filters/client_channel/xds/xds_client.h +124 -41
  90. data/src/core/ext/filters/client_channel/xds/xds_client_stats.cc +59 -138
  91. data/src/core/ext/filters/client_channel/xds/xds_client_stats.h +133 -154
  92. data/src/core/ext/filters/http/client/http_client_filter.cc +23 -28
  93. data/src/core/ext/filters/http/client_authority_filter.cc +4 -4
  94. data/src/core/ext/filters/http/http_filters_plugin.cc +27 -12
  95. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +258 -221
  96. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +358 -0
  97. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +29 -0
  98. data/src/core/ext/filters/message_size/message_size_filter.cc +38 -44
  99. data/src/core/ext/filters/message_size/message_size_filter.h +5 -5
  100. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +7 -10
  101. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +4 -6
  102. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +28 -29
  103. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -0
  104. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  105. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +2 -3
  106. data/src/core/ext/transport/chttp2/transport/frame_ping.h +2 -3
  107. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -3
  108. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -3
  109. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +2 -3
  110. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +29 -16
  111. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +2 -3
  112. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -3
  113. data/src/core/ext/transport/chttp2/transport/hpack_table.h +2 -2
  114. data/src/core/ext/transport/chttp2/transport/http2_settings.h +4 -5
  115. data/src/core/ext/transport/chttp2/transport/huffsyms.h +2 -3
  116. data/src/core/ext/transport/chttp2/transport/internal.h +14 -21
  117. data/src/core/ext/transport/chttp2/transport/stream_map.h +2 -3
  118. data/src/core/ext/transport/chttp2/transport/writing.cc +16 -9
  119. data/src/core/ext/transport/inproc/inproc_transport.cc +41 -42
  120. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +17 -0
  121. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +30 -0
  122. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +27 -0
  123. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +54 -0
  124. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +5 -205
  125. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +5 -788
  126. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c +114 -0
  127. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +418 -0
  128. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c +72 -0
  129. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +197 -0
  130. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c +105 -0
  131. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +378 -0
  132. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.c +5 -362
  133. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +14 -1337
  134. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +403 -0
  135. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +1447 -0
  136. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +30 -8
  137. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +60 -0
  138. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c +2 -0
  139. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c +2 -0
  140. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +7 -4
  141. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +6 -2
  142. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c +35 -0
  143. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +78 -0
  144. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +87 -23
  145. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +262 -62
  146. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +20 -15
  147. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +46 -32
  148. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c +34 -0
  149. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +72 -0
  150. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +27 -4
  151. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +70 -0
  152. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +46 -25
  153. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +98 -25
  154. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c +2 -0
  155. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +77 -21
  156. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +201 -4
  157. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c +34 -0
  158. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +89 -0
  159. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +2 -0
  160. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.c +8 -68
  161. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +14 -201
  162. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +92 -0
  163. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h +240 -0
  164. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +2 -71
  165. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +3 -228
  166. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +91 -0
  167. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +266 -0
  168. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +2 -0
  169. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.c +31 -0
  170. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.h +53 -0
  171. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +109 -0
  172. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +399 -0
  173. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +18 -0
  174. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h +33 -0
  175. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +145 -0
  176. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h +527 -0
  177. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +43 -0
  178. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h +112 -0
  179. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.c +30 -0
  180. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.h +53 -0
  181. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +63 -0
  182. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.h +199 -0
  183. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +18 -0
  184. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h +33 -0
  185. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +815 -0
  186. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +3032 -0
  187. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +59 -0
  188. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h +134 -0
  189. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.c +28 -0
  190. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.h +53 -0
  191. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +228 -0
  192. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h +725 -0
  193. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +316 -0
  194. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +1132 -0
  195. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c +33 -0
  196. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h +65 -0
  197. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c +51 -0
  198. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +125 -0
  199. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c +1 -0
  200. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +4 -2
  201. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +4 -0
  202. data/src/core/ext/upb-generated/envoy/type/http.upb.c +1 -0
  203. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +63 -0
  204. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +144 -0
  205. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +53 -0
  206. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.h +133 -0
  207. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +88 -0
  208. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h +258 -0
  209. data/src/core/ext/upb-generated/envoy/type/percent.upb.c +1 -0
  210. data/src/core/ext/upb-generated/envoy/type/range.upb.c +12 -0
  211. data/src/core/ext/upb-generated/envoy/type/range.upb.h +27 -0
  212. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.c +29 -0
  213. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.h +62 -0
  214. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +89 -0
  215. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h +249 -0
  216. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +9 -8
  217. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +30 -24
  218. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +30 -27
  219. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +64 -52
  220. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +13 -5
  221. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +34 -0
  222. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +48 -0
  223. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +104 -0
  224. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +17 -0
  225. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +30 -0
  226. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +28 -0
  227. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +65 -0
  228. data/src/core/ext/upb-generated/validate/validate.upb.c +44 -39
  229. data/src/core/ext/upb-generated/validate/validate.upb.h +155 -119
  230. data/src/core/lib/channel/channel_args.cc +15 -14
  231. data/src/core/lib/channel/channel_args.h +3 -1
  232. data/src/core/lib/channel/channel_stack.h +20 -13
  233. data/src/core/lib/channel/channel_trace.cc +32 -41
  234. data/src/core/lib/channel/channel_trace.h +3 -3
  235. data/src/core/lib/channel/channelz.cc +163 -254
  236. data/src/core/lib/channel/channelz.h +20 -12
  237. data/src/core/lib/channel/channelz_registry.cc +52 -77
  238. data/src/core/lib/channel/channelz_registry.h +4 -4
  239. data/src/core/lib/channel/connected_channel.cc +7 -5
  240. data/src/core/lib/channel/context.h +1 -1
  241. data/src/core/lib/channel/handshaker.cc +11 -13
  242. data/src/core/lib/channel/handshaker.h +4 -2
  243. data/src/core/lib/channel/handshaker_registry.cc +5 -17
  244. data/src/core/lib/channel/status_util.cc +2 -3
  245. data/src/core/lib/compression/message_compress.cc +5 -1
  246. data/src/core/lib/debug/stats.cc +21 -27
  247. data/src/core/lib/debug/stats.h +3 -1
  248. data/src/core/lib/gpr/spinlock.h +2 -3
  249. data/src/core/lib/gpr/string.cc +2 -26
  250. data/src/core/lib/gpr/string.h +0 -16
  251. data/src/core/lib/gpr/sync_abseil.cc +116 -0
  252. data/src/core/lib/gpr/sync_posix.cc +8 -5
  253. data/src/core/lib/gpr/sync_windows.cc +4 -2
  254. data/src/core/lib/gpr/time.cc +4 -0
  255. data/src/core/lib/gpr/time_posix.cc +1 -1
  256. data/src/core/lib/gpr/time_precise.cc +1 -1
  257. data/src/core/lib/gprpp/atomic.h +6 -6
  258. data/src/core/lib/gprpp/fork.cc +1 -1
  259. data/src/core/lib/gprpp/host_port.cc +30 -36
  260. data/src/core/lib/gprpp/host_port.h +14 -17
  261. data/src/core/lib/gprpp/map.h +5 -11
  262. data/src/core/lib/gprpp/memory.h +2 -6
  263. data/src/core/lib/gprpp/ref_counted_ptr.h +5 -0
  264. data/src/core/lib/gprpp/sync.h +9 -0
  265. data/src/core/lib/http/format_request.cc +46 -65
  266. data/src/core/lib/http/httpcli.cc +2 -3
  267. data/src/core/lib/http/httpcli.h +2 -3
  268. data/src/core/lib/http/httpcli_security_connector.cc +5 -5
  269. data/src/core/lib/http/parser.h +2 -3
  270. data/src/core/lib/iomgr/buffer_list.cc +36 -35
  271. data/src/core/lib/iomgr/buffer_list.h +22 -21
  272. data/src/core/lib/iomgr/call_combiner.h +3 -2
  273. data/src/core/lib/iomgr/cfstream_handle.cc +3 -2
  274. data/src/core/lib/iomgr/closure.h +2 -3
  275. data/src/core/lib/iomgr/dualstack_socket_posix.cc +47 -0
  276. data/src/core/lib/iomgr/endpoint_cfstream.cc +2 -3
  277. data/src/core/lib/iomgr/endpoint_pair.h +2 -3
  278. data/src/core/lib/iomgr/error.cc +6 -9
  279. data/src/core/lib/iomgr/error.h +4 -5
  280. data/src/core/lib/iomgr/ev_apple.cc +356 -0
  281. data/src/core/lib/iomgr/ev_apple.h +43 -0
  282. data/src/core/lib/iomgr/ev_epoll1_linux.cc +20 -23
  283. data/src/core/lib/iomgr/ev_epollex_linux.cc +14 -7
  284. data/src/core/lib/iomgr/ev_poll_posix.cc +3 -3
  285. data/src/core/lib/iomgr/ev_posix.cc +2 -3
  286. data/src/core/lib/iomgr/exec_ctx.h +14 -2
  287. data/src/core/lib/iomgr/executor.cc +1 -1
  288. data/src/core/lib/iomgr/fork_posix.cc +4 -0
  289. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +84 -20
  290. data/src/core/lib/iomgr/load_file.cc +1 -0
  291. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +87 -0
  292. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +88 -0
  293. data/src/core/lib/iomgr/pollset_set_custom.cc +10 -10
  294. data/src/core/lib/iomgr/pollset_uv.h +32 -0
  295. data/src/core/lib/iomgr/port.h +1 -0
  296. data/src/core/lib/iomgr/python_util.h +46 -0
  297. data/src/core/lib/iomgr/resolve_address.h +4 -6
  298. data/src/core/lib/iomgr/resolve_address_custom.cc +29 -39
  299. data/src/core/lib/iomgr/resolve_address_custom.h +4 -2
  300. data/src/core/lib/iomgr/resolve_address_posix.cc +10 -11
  301. data/src/core/lib/iomgr/resolve_address_windows.cc +8 -17
  302. data/src/core/lib/iomgr/resource_quota.cc +4 -6
  303. data/src/core/lib/iomgr/sockaddr_utils.cc +23 -29
  304. data/src/core/lib/iomgr/sockaddr_utils.h +9 -14
  305. data/src/core/lib/iomgr/socket_factory_posix.h +2 -3
  306. data/src/core/lib/iomgr/socket_mutator.h +2 -3
  307. data/src/core/lib/iomgr/socket_utils_common_posix.cc +21 -26
  308. data/src/core/lib/iomgr/socket_utils_posix.h +15 -0
  309. data/src/core/lib/iomgr/tcp_client_cfstream.cc +5 -7
  310. data/src/core/lib/iomgr/tcp_client_posix.cc +25 -22
  311. data/src/core/lib/iomgr/tcp_client_posix.h +6 -6
  312. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -3
  313. data/src/core/lib/iomgr/tcp_custom.cc +2 -3
  314. data/src/core/lib/iomgr/tcp_custom.h +3 -0
  315. data/src/core/lib/iomgr/tcp_posix.cc +608 -56
  316. data/src/core/lib/iomgr/tcp_server_custom.cc +20 -11
  317. data/src/core/lib/iomgr/tcp_server_posix.cc +5 -4
  318. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +13 -4
  319. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +8 -11
  320. data/src/core/lib/iomgr/tcp_uv.cc +3 -2
  321. data/src/core/lib/iomgr/time_averaged_stats.h +2 -3
  322. data/src/core/lib/iomgr/timer_generic.cc +2 -3
  323. data/src/core/lib/iomgr/timer_generic.h +39 -0
  324. data/src/core/lib/iomgr/timer_heap.h +2 -3
  325. data/src/core/lib/iomgr/udp_server.cc +9 -14
  326. data/src/core/lib/iomgr/work_serializer.cc +155 -0
  327. data/src/core/lib/iomgr/work_serializer.h +65 -0
  328. data/src/core/lib/json/json.h +209 -68
  329. data/src/core/lib/json/json_reader.cc +511 -319
  330. data/src/core/lib/json/json_writer.cc +202 -110
  331. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +1 -1
  332. data/src/core/lib/security/credentials/composite/composite_credentials.cc +19 -0
  333. data/src/core/lib/security/credentials/composite/composite_credentials.h +11 -4
  334. data/src/core/lib/security/credentials/credentials.cc +0 -84
  335. data/src/core/lib/security/credentials/credentials.h +18 -60
  336. data/src/core/lib/security/credentials/fake/fake_credentials.h +6 -1
  337. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +9 -12
  338. data/src/core/lib/security/credentials/iam/iam_credentials.cc +8 -6
  339. data/src/core/lib/security/credentials/iam/iam_credentials.h +4 -0
  340. data/src/core/lib/security/credentials/jwt/json_token.cc +26 -56
  341. data/src/core/lib/security/credentials/jwt/json_token.h +4 -6
  342. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +8 -18
  343. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +12 -0
  344. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +151 -168
  345. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +4 -6
  346. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +92 -61
  347. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +10 -4
  348. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +19 -4
  349. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +4 -1
  350. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +43 -13
  351. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +47 -11
  352. data/src/core/lib/security/credentials/tls/tls_credentials.cc +128 -0
  353. data/src/core/lib/security/credentials/tls/tls_credentials.h +62 -0
  354. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +34 -6
  355. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +29 -9
  356. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +2 -2
  357. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +5 -4
  358. data/src/core/lib/security/security_connector/local/local_security_connector.cc +32 -7
  359. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  360. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +20 -37
  361. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -6
  362. data/src/core/lib/security/security_connector/ssl_utils.cc +107 -16
  363. data/src/core/lib/security/security_connector/ssl_utils.h +24 -11
  364. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +603 -0
  365. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +183 -0
  366. data/src/core/lib/security/transport/client_auth_filter.cc +34 -2
  367. data/src/core/lib/security/transport/security_handshaker.cc +2 -2
  368. data/src/core/lib/security/util/json_util.cc +22 -15
  369. data/src/core/lib/security/util/json_util.h +2 -2
  370. data/src/core/lib/slice/slice_intern.cc +2 -3
  371. data/src/core/lib/slice/slice_internal.h +14 -0
  372. data/src/core/lib/slice/slice_utils.h +9 -0
  373. data/src/core/lib/surface/byte_buffer_reader.cc +2 -47
  374. data/src/core/lib/surface/call.cc +2 -3
  375. data/src/core/lib/surface/call_log_batch.cc +50 -58
  376. data/src/core/lib/surface/channel.cc +53 -31
  377. data/src/core/lib/surface/channel.h +35 -4
  378. data/src/core/lib/surface/channel_ping.cc +2 -3
  379. data/src/core/lib/surface/completion_queue.cc +55 -34
  380. data/src/core/lib/surface/event_string.cc +18 -25
  381. data/src/core/lib/surface/event_string.h +3 -1
  382. data/src/core/lib/surface/init_secure.cc +1 -4
  383. data/src/core/lib/surface/server.cc +570 -369
  384. data/src/core/lib/surface/server.h +32 -0
  385. data/src/core/lib/surface/version.cc +2 -2
  386. data/src/core/lib/transport/byte_stream.h +7 -2
  387. data/src/core/lib/transport/connectivity_state.cc +7 -6
  388. data/src/core/lib/transport/connectivity_state.h +5 -3
  389. data/src/core/lib/transport/metadata.cc +3 -3
  390. data/src/core/lib/transport/metadata_batch.h +2 -3
  391. data/src/core/lib/transport/static_metadata.h +1 -1
  392. data/src/core/lib/transport/status_conversion.cc +6 -14
  393. data/src/core/lib/transport/transport.cc +2 -3
  394. data/src/core/lib/transport/transport.h +3 -2
  395. data/src/core/lib/transport/transport_op_string.cc +61 -102
  396. data/src/core/lib/uri/uri_parser.h +2 -3
  397. data/src/core/plugin_registry/grpc_plugin_registry.cc +20 -4
  398. data/src/core/tsi/alts/crypt/aes_gcm.cc +0 -2
  399. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +9 -2
  400. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +8 -4
  401. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +44 -4
  402. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +10 -2
  403. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +2 -3
  404. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +3 -3
  405. data/src/core/tsi/fake_transport_security.cc +17 -18
  406. data/src/core/tsi/fake_transport_security.h +2 -0
  407. data/src/core/tsi/ssl/session_cache/ssl_session.h +0 -2
  408. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
  409. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +0 -2
  410. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +1 -1
  411. data/src/core/tsi/ssl_transport_security.cc +197 -47
  412. data/src/core/tsi/ssl_transport_security.h +23 -9
  413. data/src/core/tsi/ssl_types.h +0 -2
  414. data/src/core/tsi/transport_security.cc +13 -0
  415. data/src/core/tsi/transport_security.h +6 -9
  416. data/src/core/tsi/transport_security_grpc.cc +2 -2
  417. data/src/core/tsi/transport_security_grpc.h +4 -5
  418. data/src/core/tsi/transport_security_interface.h +15 -3
  419. data/src/ruby/bin/math_pb.rb +5 -5
  420. data/src/ruby/ext/grpc/rb_call.c +9 -1
  421. data/src/ruby/ext/grpc/rb_call_credentials.c +4 -1
  422. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  423. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -1
  424. data/src/ruby/lib/grpc/errors.rb +103 -42
  425. data/src/ruby/lib/grpc/generic/active_call.rb +2 -3
  426. data/src/ruby/lib/grpc/generic/interceptors.rb +4 -4
  427. data/src/ruby/lib/grpc/generic/rpc_server.rb +9 -10
  428. data/src/ruby/lib/grpc/generic/service.rb +5 -4
  429. data/src/ruby/lib/grpc/structs.rb +1 -1
  430. data/src/ruby/lib/grpc/version.rb +1 -1
  431. data/src/ruby/pb/generate_proto_ruby.sh +5 -3
  432. data/src/ruby/pb/grpc/health/v1/health_pb.rb +3 -3
  433. data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +1 -1
  434. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +34 -13
  435. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +16 -0
  436. data/src/ruby/spec/debug_message_spec.rb +134 -0
  437. data/src/ruby/spec/generic/service_spec.rb +2 -0
  438. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +5 -0
  439. data/src/ruby/spec/pb/codegen/package_option_spec.rb +2 -0
  440. data/src/ruby/spec/testdata/ca.pem +18 -13
  441. data/src/ruby/spec/testdata/client.key +26 -14
  442. data/src/ruby/spec/testdata/client.pem +18 -12
  443. data/src/ruby/spec/testdata/server1.key +26 -14
  444. data/src/ruby/spec/testdata/server1.pem +20 -14
  445. data/third_party/abseil-cpp/absl/algorithm/algorithm.h +159 -0
  446. data/third_party/abseil-cpp/absl/base/attributes.h +621 -0
  447. data/third_party/abseil-cpp/absl/base/call_once.h +226 -0
  448. data/third_party/abseil-cpp/absl/base/casts.h +184 -0
  449. data/third_party/abseil-cpp/absl/base/config.h +671 -0
  450. data/third_party/abseil-cpp/absl/base/const_init.h +76 -0
  451. data/third_party/abseil-cpp/absl/base/dynamic_annotations.cc +129 -0
  452. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +389 -0
  453. data/third_party/abseil-cpp/absl/base/internal/atomic_hook.h +200 -0
  454. data/third_party/abseil-cpp/absl/base/internal/bits.h +218 -0
  455. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +107 -0
  456. data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +94 -0
  457. data/third_party/abseil-cpp/absl/base/internal/endian.h +266 -0
  458. data/third_party/abseil-cpp/absl/base/internal/errno_saver.h +43 -0
  459. data/third_party/abseil-cpp/absl/base/internal/hide_ptr.h +51 -0
  460. data/third_party/abseil-cpp/absl/base/internal/identity.h +37 -0
  461. data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +107 -0
  462. data/third_party/abseil-cpp/absl/base/internal/invoke.h +187 -0
  463. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +107 -0
  464. data/third_party/abseil-cpp/absl/base/internal/per_thread_tls.h +52 -0
  465. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +240 -0
  466. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +183 -0
  467. data/third_party/abseil-cpp/absl/base/internal/scheduling_mode.h +58 -0
  468. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +233 -0
  469. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +243 -0
  470. data/third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc +35 -0
  471. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +66 -0
  472. data/third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc +46 -0
  473. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.cc +81 -0
  474. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +93 -0
  475. data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +37 -0
  476. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +416 -0
  477. data/third_party/abseil-cpp/absl/base/internal/sysinfo.h +66 -0
  478. data/third_party/abseil-cpp/absl/base/internal/thread_annotations.h +271 -0
  479. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +152 -0
  480. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +259 -0
  481. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +108 -0
  482. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.h +75 -0
  483. data/third_party/abseil-cpp/absl/base/internal/tsan_mutex_interface.h +66 -0
  484. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +158 -0
  485. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +140 -0
  486. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +124 -0
  487. data/third_party/abseil-cpp/absl/base/log_severity.cc +27 -0
  488. data/third_party/abseil-cpp/absl/base/log_severity.h +121 -0
  489. data/third_party/abseil-cpp/absl/base/macros.h +220 -0
  490. data/third_party/abseil-cpp/absl/base/optimization.h +181 -0
  491. data/third_party/abseil-cpp/absl/base/options.h +211 -0
  492. data/third_party/abseil-cpp/absl/base/policy_checks.h +111 -0
  493. data/third_party/abseil-cpp/absl/base/port.h +26 -0
  494. data/third_party/abseil-cpp/absl/base/thread_annotations.h +280 -0
  495. data/third_party/abseil-cpp/absl/container/inlined_vector.h +848 -0
  496. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +265 -0
  497. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +892 -0
  498. data/third_party/abseil-cpp/absl/memory/memory.h +695 -0
  499. data/third_party/abseil-cpp/absl/meta/type_traits.h +759 -0
  500. data/third_party/abseil-cpp/absl/numeric/int128.cc +404 -0
  501. data/third_party/abseil-cpp/absl/numeric/int128.h +1091 -0
  502. data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +302 -0
  503. data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +308 -0
  504. data/third_party/abseil-cpp/absl/strings/ascii.cc +200 -0
  505. data/third_party/abseil-cpp/absl/strings/ascii.h +242 -0
  506. data/third_party/abseil-cpp/absl/strings/charconv.cc +984 -0
  507. data/third_party/abseil-cpp/absl/strings/charconv.h +119 -0
  508. data/third_party/abseil-cpp/absl/strings/escaping.cc +949 -0
  509. data/third_party/abseil-cpp/absl/strings/escaping.h +164 -0
  510. data/third_party/abseil-cpp/absl/strings/internal/char_map.h +156 -0
  511. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +359 -0
  512. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h +423 -0
  513. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +504 -0
  514. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.h +99 -0
  515. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +180 -0
  516. data/third_party/abseil-cpp/absl/strings/internal/escaping.h +58 -0
  517. data/third_party/abseil-cpp/absl/strings/internal/memutil.cc +112 -0
  518. data/third_party/abseil-cpp/absl/strings/internal/memutil.h +148 -0
  519. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +36 -0
  520. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.h +89 -0
  521. data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +73 -0
  522. data/third_party/abseil-cpp/absl/strings/internal/stl_type_traits.h +248 -0
  523. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +388 -0
  524. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +432 -0
  525. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +245 -0
  526. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +209 -0
  527. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +326 -0
  528. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +51 -0
  529. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +415 -0
  530. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +493 -0
  531. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +23 -0
  532. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.cc +72 -0
  533. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +104 -0
  534. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +334 -0
  535. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +333 -0
  536. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +314 -0
  537. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +455 -0
  538. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +53 -0
  539. data/third_party/abseil-cpp/absl/strings/internal/utf8.h +50 -0
  540. data/third_party/abseil-cpp/absl/strings/match.cc +40 -0
  541. data/third_party/abseil-cpp/absl/strings/match.h +90 -0
  542. data/third_party/abseil-cpp/absl/strings/numbers.cc +965 -0
  543. data/third_party/abseil-cpp/absl/strings/numbers.h +266 -0
  544. data/third_party/abseil-cpp/absl/strings/str_cat.cc +246 -0
  545. data/third_party/abseil-cpp/absl/strings/str_cat.h +408 -0
  546. data/third_party/abseil-cpp/absl/strings/str_format.h +537 -0
  547. data/third_party/abseil-cpp/absl/strings/str_join.h +293 -0
  548. data/third_party/abseil-cpp/absl/strings/str_replace.cc +82 -0
  549. data/third_party/abseil-cpp/absl/strings/str_replace.h +219 -0
  550. data/third_party/abseil-cpp/absl/strings/str_split.cc +139 -0
  551. data/third_party/abseil-cpp/absl/strings/str_split.h +513 -0
  552. data/third_party/abseil-cpp/absl/strings/string_view.cc +235 -0
  553. data/third_party/abseil-cpp/absl/strings/string_view.h +622 -0
  554. data/third_party/abseil-cpp/absl/strings/strip.h +91 -0
  555. data/third_party/abseil-cpp/absl/strings/substitute.cc +171 -0
  556. data/third_party/abseil-cpp/absl/strings/substitute.h +693 -0
  557. data/third_party/abseil-cpp/absl/time/civil_time.cc +175 -0
  558. data/third_party/abseil-cpp/absl/time/civil_time.h +538 -0
  559. data/third_party/abseil-cpp/absl/time/clock.cc +569 -0
  560. data/third_party/abseil-cpp/absl/time/clock.h +74 -0
  561. data/third_party/abseil-cpp/absl/time/duration.cc +922 -0
  562. data/third_party/abseil-cpp/absl/time/format.cc +153 -0
  563. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time.h +332 -0
  564. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +622 -0
  565. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +384 -0
  566. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +102 -0
  567. data/third_party/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc +94 -0
  568. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +140 -0
  569. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.h +52 -0
  570. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +922 -0
  571. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc +45 -0
  572. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +76 -0
  573. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +121 -0
  574. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +93 -0
  575. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +958 -0
  576. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +138 -0
  577. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +308 -0
  578. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.h +55 -0
  579. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +187 -0
  580. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc +159 -0
  581. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.h +132 -0
  582. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +122 -0
  583. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +115 -0
  584. data/third_party/abseil-cpp/absl/time/internal/get_current_time_chrono.inc +31 -0
  585. data/third_party/abseil-cpp/absl/time/internal/get_current_time_posix.inc +24 -0
  586. data/third_party/abseil-cpp/absl/time/time.cc +499 -0
  587. data/third_party/abseil-cpp/absl/time/time.h +1584 -0
  588. data/third_party/abseil-cpp/absl/types/bad_optional_access.cc +48 -0
  589. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +78 -0
  590. data/third_party/abseil-cpp/absl/types/internal/optional.h +396 -0
  591. data/third_party/abseil-cpp/absl/types/internal/span.h +128 -0
  592. data/third_party/abseil-cpp/absl/types/optional.h +776 -0
  593. data/third_party/abseil-cpp/absl/types/span.h +713 -0
  594. data/third_party/abseil-cpp/absl/utility/utility.h +350 -0
  595. data/third_party/boringssl-with-bazel/err_data.c +1439 -0
  596. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_bitstr.c +0 -0
  597. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_bool.c +0 -0
  598. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_d2i_fp.c +0 -0
  599. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_dup.c +0 -0
  600. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_enum.c +0 -0
  601. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_gentm.c +0 -0
  602. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_i2d_fp.c +0 -0
  603. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_int.c +0 -0
  604. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_mbstr.c +0 -0
  605. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_object.c +0 -0
  606. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_octet.c +0 -0
  607. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_print.c +0 -0
  608. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_strnid.c +0 -0
  609. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +212 -0
  610. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_type.c +0 -0
  611. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_utctm.c +0 -0
  612. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_utf8.c +0 -0
  613. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/asn1_lib.c +0 -0
  614. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/asn1_locl.h +0 -0
  615. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/asn1_par.c +0 -0
  616. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/asn_pack.c +0 -0
  617. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/f_enum.c +0 -0
  618. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/f_int.c +0 -0
  619. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/f_string.c +0 -0
  620. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_dec.c +0 -0
  621. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_enc.c +0 -0
  622. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_fre.c +0 -0
  623. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_new.c +0 -0
  624. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_typ.c +0 -0
  625. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_utl.c +0 -0
  626. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/time_support.c +0 -0
  627. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/base64/base64.c +0 -0
  628. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/bio.c +0 -0
  629. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/bio_mem.c +0 -0
  630. data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +545 -0
  631. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +279 -0
  632. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +317 -0
  633. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/hexdump.c +0 -0
  634. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/internal.h +0 -0
  635. data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +488 -0
  636. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/printf.c +0 -0
  637. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/socket.c +0 -0
  638. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/socket_helper.c +0 -0
  639. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bn_extra/bn_asn1.c +0 -0
  640. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bn_extra/convert.c +0 -0
  641. data/third_party/boringssl-with-bazel/src/crypto/buf/buf.c +172 -0
  642. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bytestring/asn1_compat.c +0 -0
  643. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bytestring/ber.c +0 -0
  644. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c +719 -0
  645. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +688 -0
  646. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bytestring/internal.h +0 -0
  647. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bytestring/unicode.c +0 -0
  648. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/chacha/chacha.c +0 -0
  649. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/chacha/internal.h +0 -0
  650. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/cipher_extra.c +0 -0
  651. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c +152 -0
  652. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_aesccm.c +0 -0
  653. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_aesctrhmac.c +0 -0
  654. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesgcmsiv.c +891 -0
  655. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_chacha20poly1305.c +0 -0
  656. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_null.c +0 -0
  657. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_rc2.c +0 -0
  658. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_rc4.c +0 -0
  659. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_tls.c +0 -0
  660. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/internal.h +0 -0
  661. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/tls_cbc.c +0 -0
  662. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cmac/cmac.c +0 -0
  663. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/conf/conf.c +0 -0
  664. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/conf/conf_def.h +0 -0
  665. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/conf/internal.h +0 -0
  666. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-aarch64-fuchsia.c +0 -0
  667. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-aarch64-linux.c +0 -0
  668. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +220 -0
  669. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-arm-linux.h +0 -0
  670. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-arm.c +0 -0
  671. data/third_party/boringssl-with-bazel/src/crypto/cpu-intel.c +291 -0
  672. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-ppc64le.c +0 -0
  673. data/third_party/boringssl-with-bazel/src/crypto/crypto.c +226 -0
  674. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c +2159 -0
  675. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_tables.h +7872 -0
  676. data/third_party/boringssl-with-bazel/src/crypto/curve25519/internal.h +146 -0
  677. data/third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c +539 -0
  678. data/third_party/boringssl-with-bazel/src/crypto/dh/check.c +217 -0
  679. data/third_party/boringssl-with-bazel/src/crypto/dh/dh.c +533 -0
  680. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/dh/dh_asn1.c +0 -0
  681. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/dh/params.c +0 -0
  682. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/digest_extra/digest_extra.c +0 -0
  683. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +980 -0
  684. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/dsa/dsa_asn1.c +0 -0
  685. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/ec_extra/ec_asn1.c +0 -0
  686. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_derive.c +95 -0
  687. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +425 -0
  688. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +78 -0
  689. data/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c +124 -0
  690. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/ecdsa_extra/ecdsa_asn1.c +0 -0
  691. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/engine/engine.c +0 -0
  692. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +850 -0
  693. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/err/internal.h +0 -0
  694. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/digestsign.c +0 -0
  695. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/evp.c +0 -0
  696. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/evp_asn1.c +0 -0
  697. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/evp_ctx.c +0 -0
  698. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/internal.h +0 -0
  699. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_dsa_asn1.c +0 -0
  700. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c +286 -0
  701. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_ec_asn1.c +0 -0
  702. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_ed25519.c +0 -0
  703. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_ed25519_asn1.c +0 -0
  704. data/third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c +648 -0
  705. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_rsa_asn1.c +0 -0
  706. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_x25519.c +0 -0
  707. data/third_party/boringssl-with-bazel/src/crypto/evp/p_x25519_asn1.c +248 -0
  708. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/pbkdf.c +0 -0
  709. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/print.c +0 -0
  710. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/scrypt.c +0 -0
  711. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/sign.c +0 -0
  712. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/ex_data.c +0 -0
  713. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes.c +108 -0
  714. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c +1282 -0
  715. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/internal.h +238 -0
  716. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/aes/key_wrap.c +0 -0
  717. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.c +106 -0
  718. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +263 -0
  719. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/add.c +0 -0
  720. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/asm/x86_64-gcc.c +0 -0
  721. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/bn.c +0 -0
  722. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/bytes.c +0 -0
  723. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/cmp.c +0 -0
  724. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/ctx.c +0 -0
  725. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/div.c +0 -0
  726. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/div_extra.c +0 -0
  727. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +1288 -0
  728. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/gcd.c +0 -0
  729. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/gcd_extra.c +0 -0
  730. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/generic.c +0 -0
  731. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +694 -0
  732. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/jacobi.c +0 -0
  733. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c +502 -0
  734. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/montgomery_inv.c +0 -0
  735. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.c +749 -0
  736. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/prime.c +1068 -0
  737. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/random.c +0 -0
  738. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/rsaz_exp.c +0 -0
  739. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/rsaz_exp.h +0 -0
  740. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/shift.c +0 -0
  741. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/sqrt.c +0 -0
  742. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/cipher/aead.c +0 -0
  743. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/cipher/cipher.c +0 -0
  744. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +1302 -0
  745. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/cipher/e_des.c +0 -0
  746. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/cipher/internal.h +0 -0
  747. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/delocate.h +0 -0
  748. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/des/des.c +0 -0
  749. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/des/internal.h +0 -0
  750. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/digest/digest.c +0 -0
  751. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +296 -0
  752. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/digest/internal.h +0 -0
  753. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/digest/md32_common.h +0 -0
  754. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +1252 -0
  755. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +465 -0
  756. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +524 -0
  757. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/felem.c +100 -0
  758. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +775 -0
  759. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +328 -0
  760. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +1178 -0
  761. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64-table.h +9497 -0
  762. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.c +632 -0
  763. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/p256-x86_64.h +0 -0
  764. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +736 -0
  765. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256_table.h +297 -0
  766. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c +175 -0
  767. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +357 -0
  768. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +270 -0
  769. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/util.c +0 -0
  770. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +270 -0
  771. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +122 -0
  772. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +328 -0
  773. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/fips_shared_support.c +0 -0
  774. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/hmac/hmac.c +0 -0
  775. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/is_fips.c +0 -0
  776. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/md4/md4.c +0 -0
  777. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/md5/internal.h +0 -0
  778. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/md5/md5.c +0 -0
  779. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/cbc.c +0 -0
  780. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/cfb.c +0 -0
  781. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/ctr.c +0 -0
  782. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +729 -0
  783. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +304 -0
  784. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +441 -0
  785. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/ofb.c +0 -0
  786. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/polyval.c +0 -0
  787. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rand/ctrdrbg.c +0 -0
  788. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.c +137 -0
  789. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.h +49 -0
  790. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/getrandom_fillin.h +64 -0
  791. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +163 -0
  792. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +378 -0
  793. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +391 -0
  794. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/blinding.c +243 -0
  795. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +127 -0
  796. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rsa/padding.c +0 -0
  797. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +898 -0
  798. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +1358 -0
  799. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/self_check/self_check.c +0 -0
  800. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/sha/internal.h +0 -0
  801. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/sha/sha1-altivec.c +0 -0
  802. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/sha/sha1.c +0 -0
  803. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/sha/sha256.c +0 -0
  804. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +544 -0
  805. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/tls/internal.h +0 -0
  806. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/tls/kdf.c +0 -0
  807. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/hkdf/hkdf.c +0 -0
  808. data/third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c +2100 -0
  809. data/third_party/boringssl-with-bazel/src/crypto/hrss/internal.h +61 -0
  810. data/third_party/boringssl-with-bazel/src/crypto/internal.h +834 -0
  811. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/lhash/lhash.c +0 -0
  812. data/third_party/boringssl-with-bazel/src/crypto/mem.c +359 -0
  813. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +549 -0
  814. data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +11585 -0
  815. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/obj/obj_xref.c +0 -0
  816. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_all.c +0 -0
  817. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c +360 -0
  818. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +777 -0
  819. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_oth.c +87 -0
  820. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c +257 -0
  821. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c +218 -0
  822. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_x509.c +0 -0
  823. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_xaux.c +0 -0
  824. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs7/internal.h +0 -0
  825. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs7/pkcs7.c +0 -0
  826. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +385 -0
  827. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs8/internal.h +0 -0
  828. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs8/p5_pbev2.c +0 -0
  829. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs8/pkcs8.c +0 -0
  830. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs8/pkcs8_x509.c +0 -0
  831. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/poly1305/internal.h +0 -0
  832. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +318 -0
  833. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c +305 -0
  834. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c +856 -0
  835. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pool/internal.h +0 -0
  836. data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +220 -0
  837. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c +52 -0
  838. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rand_extra/forkunsafe.c +0 -0
  839. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rand_extra/fuchsia.c +0 -0
  840. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rand_extra/rand_extra.c +0 -0
  841. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c +69 -0
  842. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rc4/rc4.c +0 -0
  843. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/refcount_c11.c +0 -0
  844. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/refcount_lock.c +0 -0
  845. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rsa_extra/rsa_asn1.c +0 -0
  846. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rsa_extra/rsa_print.c +0 -0
  847. data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +82 -0
  848. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/stack/stack.c +0 -0
  849. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/thread.c +0 -0
  850. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/thread_none.c +0 -0
  851. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +210 -0
  852. data/third_party/boringssl-with-bazel/src/crypto/thread_win.c +260 -0
  853. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +278 -0
  854. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +1474 -0
  855. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +720 -0
  856. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/a_digest.c +0 -0
  857. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/a_sign.c +0 -0
  858. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/a_strex.c +0 -0
  859. data/third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c +114 -0
  860. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/algorithm.c +0 -0
  861. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/asn1_gen.c +0 -0
  862. data/third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c +458 -0
  863. data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +275 -0
  864. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/charmap.h +0 -0
  865. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/i2d_pr.c +0 -0
  866. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/internal.h +0 -0
  867. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/rsa_pss.c +0 -0
  868. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/t_crl.c +0 -0
  869. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/t_req.c +0 -0
  870. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/t_x509.c +0 -0
  871. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/t_x509a.c +0 -0
  872. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/vpm_int.h +0 -0
  873. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509.c +0 -0
  874. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_att.c +0 -0
  875. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +476 -0
  876. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_d2.c +0 -0
  877. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_def.c +0 -0
  878. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_ext.c +0 -0
  879. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_lu.c +0 -0
  880. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +198 -0
  881. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c +116 -0
  882. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +341 -0
  883. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +185 -0
  884. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +326 -0
  885. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_txt.c +0 -0
  886. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_v3.c +0 -0
  887. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +2487 -0
  888. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +671 -0
  889. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509cset.c +0 -0
  890. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +389 -0
  891. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509rset.c +0 -0
  892. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509spki.c +0 -0
  893. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_algor.c +0 -0
  894. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +399 -0
  895. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_attrib.c +0 -0
  896. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_crl.c +0 -0
  897. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_exten.c +0 -0
  898. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_info.c +0 -0
  899. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_name.c +0 -0
  900. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_pkey.c +0 -0
  901. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_pubkey.c +0 -0
  902. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_req.c +0 -0
  903. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_sig.c +0 -0
  904. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_spki.c +0 -0
  905. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_val.c +0 -0
  906. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_x509.c +0 -0
  907. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_x509a.c +0 -0
  908. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/ext_dat.h +0 -0
  909. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/internal.h +0 -0
  910. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_cache.c +0 -0
  911. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_data.c +0 -0
  912. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_int.h +0 -0
  913. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_lib.c +0 -0
  914. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_map.c +0 -0
  915. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_node.c +0 -0
  916. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_tree.c +0 -0
  917. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_akey.c +0 -0
  918. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_akeya.c +0 -0
  919. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +629 -0
  920. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_bcons.c +0 -0
  921. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_bitst.c +0 -0
  922. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_conf.c +0 -0
  923. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_cpols.c +0 -0
  924. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_crld.c +0 -0
  925. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +100 -0
  926. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_extku.c +0 -0
  927. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_genn.c +0 -0
  928. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_ia5.c +0 -0
  929. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c +218 -0
  930. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_int.c +0 -0
  931. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_lib.c +0 -0
  932. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_ncons.c +0 -0
  933. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_ocsp.c +0 -0
  934. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pci.c +0 -0
  935. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pcia.c +0 -0
  936. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pcons.c +0 -0
  937. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pku.c +0 -0
  938. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pmaps.c +0 -0
  939. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_prn.c +0 -0
  940. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +843 -0
  941. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_skey.c +0 -0
  942. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_sxnet.c +0 -0
  943. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +1395 -0
  944. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/aead.h +0 -0
  945. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/aes.h +0 -0
  946. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/arm_arch.h +0 -0
  947. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/asn1.h +0 -0
  948. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/asn1_mac.h +0 -0
  949. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/asn1t.h +0 -0
  950. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +575 -0
  951. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/base64.h +0 -0
  952. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/bio.h +0 -0
  953. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/blowfish.h +0 -0
  954. data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +1057 -0
  955. data/third_party/boringssl-with-bazel/src/include/openssl/buf.h +137 -0
  956. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/buffer.h +0 -0
  957. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +561 -0
  958. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/cast.h +0 -0
  959. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/chacha.h +0 -0
  960. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/cipher.h +0 -0
  961. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/cmac.h +0 -0
  962. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/conf.h +0 -0
  963. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/cpu.h +0 -0
  964. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +149 -0
  965. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/curve25519.h +0 -0
  966. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/des.h +0 -0
  967. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +319 -0
  968. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +331 -0
  969. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +457 -0
  970. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/dtls1.h +0 -0
  971. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/e_os2.h +0 -0
  972. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +424 -0
  973. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +372 -0
  974. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ecdh.h +0 -0
  975. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +205 -0
  976. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/engine.h +0 -0
  977. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +465 -0
  978. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +1050 -0
  979. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ex_data.h +0 -0
  980. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/hkdf.h +0 -0
  981. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/hmac.h +0 -0
  982. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/hrss.h +0 -0
  983. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/is_boringssl.h +0 -0
  984. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/lhash.h +0 -0
  985. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/md4.h +0 -0
  986. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/md5.h +0 -0
  987. data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +175 -0
  988. data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +4259 -0
  989. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/obj.h +0 -0
  990. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/obj_mac.h +0 -0
  991. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/objects.h +0 -0
  992. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/opensslconf.h +0 -0
  993. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/opensslv.h +0 -0
  994. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ossl_typ.h +0 -0
  995. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/pem.h +0 -0
  996. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/pkcs12.h +0 -0
  997. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/pkcs7.h +0 -0
  998. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/pkcs8.h +0 -0
  999. data/third_party/boringssl-with-bazel/src/include/openssl/poly1305.h +49 -0
  1000. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/pool.h +0 -0
  1001. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +111 -0
  1002. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/rc4.h +0 -0
  1003. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ripemd.h +0 -0
  1004. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +818 -0
  1005. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/safestack.h +0 -0
  1006. data/third_party/boringssl-with-bazel/src/include/openssl/sha.h +294 -0
  1007. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/siphash.h +0 -0
  1008. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/span.h +0 -0
  1009. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/srtp.h +0 -0
  1010. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +5198 -0
  1011. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ssl3.h +0 -0
  1012. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/stack.h +0 -0
  1013. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/thread.h +0 -0
  1014. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +632 -0
  1015. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +291 -0
  1016. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/type_check.h +0 -0
  1017. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +1207 -0
  1018. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +681 -0
  1019. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/x509v3.h +0 -0
  1020. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/bio_ssl.cc +0 -0
  1021. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +837 -0
  1022. data/third_party/boringssl-with-bazel/src/ssl/d1_lib.cc +268 -0
  1023. data/third_party/boringssl-with-bazel/src/ssl/d1_pkt.cc +273 -0
  1024. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/d1_srtp.cc +0 -0
  1025. data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +200 -0
  1026. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/dtls_record.cc +0 -0
  1027. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +675 -0
  1028. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +703 -0
  1029. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +1890 -0
  1030. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +1805 -0
  1031. data/third_party/boringssl-with-bazel/src/ssl/internal.h +3572 -0
  1032. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +724 -0
  1033. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +221 -0
  1034. data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +458 -0
  1035. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_aead_ctx.cc +0 -0
  1036. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +856 -0
  1037. data/third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc +306 -0
  1038. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +1019 -0
  1039. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +1718 -0
  1040. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_file.cc +0 -0
  1041. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_key_share.cc +0 -0
  1042. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +3015 -0
  1043. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +835 -0
  1044. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +1333 -0
  1045. data/third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc +230 -0
  1046. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_transcript.cc +0 -0
  1047. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +394 -0
  1048. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_x509.cc +0 -0
  1049. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +365 -0
  1050. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +3870 -0
  1051. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +689 -0
  1052. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +1017 -0
  1053. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +513 -0
  1054. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +1096 -0
  1055. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +317 -0
  1056. data/third_party/boringssl-with-bazel/src/ssl/tls_record.cc +703 -0
  1057. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_32.h +981 -0
  1058. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64.h +619 -0
  1059. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_32.h +3147 -0
  1060. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64.h +1226 -0
  1061. data/third_party/upb/upb/decode.c +4 -0
  1062. data/third_party/upb/upb/port.c +0 -1
  1063. data/third_party/upb/upb/port_def.inc +1 -3
  1064. data/third_party/upb/upb/table.c +2 -1
  1065. metadata +758 -509
  1066. data/src/boringssl/err_data.c +0 -1407
  1067. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +0 -1898
  1068. data/src/core/lib/gprpp/inlined_vector.h +0 -246
  1069. data/src/core/lib/gprpp/optional.h +0 -48
  1070. data/src/core/lib/gprpp/string_view.h +0 -165
  1071. data/src/core/lib/iomgr/logical_thread.cc +0 -103
  1072. data/src/core/lib/iomgr/logical_thread.h +0 -52
  1073. data/src/core/lib/json/json.cc +0 -94
  1074. data/src/core/lib/json/json_common.h +0 -34
  1075. data/src/core/lib/json/json_reader.h +0 -146
  1076. data/src/core/lib/json/json_string.cc +0 -367
  1077. data/src/core/lib/json/json_writer.h +0 -84
  1078. data/src/core/lib/security/credentials/tls/spiffe_credentials.cc +0 -129
  1079. data/src/core/lib/security/credentials/tls/spiffe_credentials.h +0 -62
  1080. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +0 -541
  1081. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +0 -158
  1082. data/src/core/tsi/grpc_shadow_boringssl.h +0 -3297
  1083. data/third_party/boringssl/crypto/asn1/a_time.c +0 -213
  1084. data/third_party/boringssl/crypto/bio/connect.c +0 -546
  1085. data/third_party/boringssl/crypto/bio/fd.c +0 -280
  1086. data/third_party/boringssl/crypto/bio/file.c +0 -318
  1087. data/third_party/boringssl/crypto/bio/pair.c +0 -489
  1088. data/third_party/boringssl/crypto/buf/buf.c +0 -231
  1089. data/third_party/boringssl/crypto/bytestring/cbb.c +0 -680
  1090. data/third_party/boringssl/crypto/bytestring/cbs.c +0 -631
  1091. data/third_party/boringssl/crypto/cipher_extra/derive_key.c +0 -152
  1092. data/third_party/boringssl/crypto/cipher_extra/e_aesgcmsiv.c +0 -883
  1093. data/third_party/boringssl/crypto/cpu-arm-linux.c +0 -219
  1094. data/third_party/boringssl/crypto/cpu-intel.c +0 -282
  1095. data/third_party/boringssl/crypto/crypto.c +0 -215
  1096. data/third_party/boringssl/crypto/curve25519/spake25519.c +0 -539
  1097. data/third_party/boringssl/crypto/dh/check.c +0 -217
  1098. data/third_party/boringssl/crypto/dh/dh.c +0 -519
  1099. data/third_party/boringssl/crypto/dsa/dsa.c +0 -970
  1100. data/third_party/boringssl/crypto/ec_extra/ec_derive.c +0 -96
  1101. data/third_party/boringssl/crypto/ecdh_extra/ecdh_extra.c +0 -124
  1102. data/third_party/boringssl/crypto/err/err.c +0 -849
  1103. data/third_party/boringssl/crypto/evp/p_ec.c +0 -287
  1104. data/third_party/boringssl/crypto/evp/p_rsa.c +0 -636
  1105. data/third_party/boringssl/crypto/evp/p_x25519_asn1.c +0 -249
  1106. data/third_party/boringssl/crypto/fipsmodule/aes/aes.c +0 -860
  1107. data/third_party/boringssl/crypto/fipsmodule/aes/internal.h +0 -240
  1108. data/third_party/boringssl/crypto/fipsmodule/aes/mode_wrappers.c +0 -108
  1109. data/third_party/boringssl/crypto/fipsmodule/bcm.c +0 -260
  1110. data/third_party/boringssl/crypto/fipsmodule/bn/exponentiation.c +0 -1288
  1111. data/third_party/boringssl/crypto/fipsmodule/bn/internal.h +0 -691
  1112. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery.c +0 -502
  1113. data/third_party/boringssl/crypto/fipsmodule/bn/mul.c +0 -873
  1114. data/third_party/boringssl/crypto/fipsmodule/bn/prime.c +0 -1069
  1115. data/third_party/boringssl/crypto/fipsmodule/cipher/e_aes.c +0 -1304
  1116. data/third_party/boringssl/crypto/fipsmodule/digest/digests.c +0 -280
  1117. data/third_party/boringssl/crypto/fipsmodule/ec/ec.c +0 -1080
  1118. data/third_party/boringssl/crypto/fipsmodule/ec/ec_key.c +0 -479
  1119. data/third_party/boringssl/crypto/fipsmodule/ec/ec_montgomery.c +0 -483
  1120. data/third_party/boringssl/crypto/fipsmodule/ec/felem.c +0 -82
  1121. data/third_party/boringssl/crypto/fipsmodule/ec/internal.h +0 -503
  1122. data/third_party/boringssl/crypto/fipsmodule/ec/oct.c +0 -336
  1123. data/third_party/boringssl/crypto/fipsmodule/ec/p224-64.c +0 -1187
  1124. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64-table.h +0 -9501
  1125. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.c +0 -651
  1126. data/third_party/boringssl/crypto/fipsmodule/ec/scalar.c +0 -96
  1127. data/third_party/boringssl/crypto/fipsmodule/ec/simple.c +0 -380
  1128. data/third_party/boringssl/crypto/fipsmodule/ec/simple_mul.c +0 -84
  1129. data/third_party/boringssl/crypto/fipsmodule/ec/wnaf.c +0 -227
  1130. data/third_party/boringssl/crypto/fipsmodule/ecdh/ecdh.c +0 -122
  1131. data/third_party/boringssl/crypto/fipsmodule/ecdsa/ecdsa.c +0 -313
  1132. data/third_party/boringssl/crypto/fipsmodule/modes/gcm.c +0 -877
  1133. data/third_party/boringssl/crypto/fipsmodule/modes/internal.h +0 -451
  1134. data/third_party/boringssl/crypto/fipsmodule/rand/internal.h +0 -127
  1135. data/third_party/boringssl/crypto/fipsmodule/rand/rand.c +0 -363
  1136. data/third_party/boringssl/crypto/fipsmodule/rand/urandom.c +0 -481
  1137. data/third_party/boringssl/crypto/fipsmodule/rsa/blinding.c +0 -239
  1138. data/third_party/boringssl/crypto/fipsmodule/rsa/internal.h +0 -126
  1139. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa.c +0 -879
  1140. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa_impl.c +0 -1335
  1141. data/third_party/boringssl/crypto/fipsmodule/sha/sha512.c +0 -535
  1142. data/third_party/boringssl/crypto/hrss/hrss.c +0 -2201
  1143. data/third_party/boringssl/crypto/hrss/internal.h +0 -62
  1144. data/third_party/boringssl/crypto/internal.h +0 -814
  1145. data/third_party/boringssl/crypto/mem.c +0 -272
  1146. data/third_party/boringssl/crypto/obj/obj.c +0 -554
  1147. data/third_party/boringssl/crypto/obj/obj_dat.h +0 -11550
  1148. data/third_party/boringssl/crypto/pem/pem_info.c +0 -361
  1149. data/third_party/boringssl/crypto/pem/pem_lib.c +0 -777
  1150. data/third_party/boringssl/crypto/pem/pem_oth.c +0 -88
  1151. data/third_party/boringssl/crypto/pem/pem_pk8.c +0 -258
  1152. data/third_party/boringssl/crypto/pem/pem_pkey.c +0 -219
  1153. data/third_party/boringssl/crypto/pkcs7/pkcs7_x509.c +0 -385
  1154. data/third_party/boringssl/crypto/poly1305/poly1305.c +0 -318
  1155. data/third_party/boringssl/crypto/poly1305/poly1305_arm.c +0 -304
  1156. data/third_party/boringssl/crypto/poly1305/poly1305_vec.c +0 -839
  1157. data/third_party/boringssl/crypto/pool/pool.c +0 -221
  1158. data/third_party/boringssl/crypto/rand_extra/deterministic.c +0 -56
  1159. data/third_party/boringssl/crypto/rand_extra/windows.c +0 -53
  1160. data/third_party/boringssl/crypto/siphash/siphash.c +0 -80
  1161. data/third_party/boringssl/crypto/thread_pthread.c +0 -206
  1162. data/third_party/boringssl/crypto/thread_win.c +0 -256
  1163. data/third_party/boringssl/crypto/x509/a_verify.c +0 -115
  1164. data/third_party/boringssl/crypto/x509/by_dir.c +0 -458
  1165. data/third_party/boringssl/crypto/x509/by_file.c +0 -276
  1166. data/third_party/boringssl/crypto/x509/x509_cmp.c +0 -477
  1167. data/third_party/boringssl/crypto/x509/x509_obj.c +0 -198
  1168. data/third_party/boringssl/crypto/x509/x509_r2x.c +0 -117
  1169. data/third_party/boringssl/crypto/x509/x509_req.c +0 -342
  1170. data/third_party/boringssl/crypto/x509/x509_set.c +0 -169
  1171. data/third_party/boringssl/crypto/x509/x509_trs.c +0 -327
  1172. data/third_party/boringssl/crypto/x509/x509_vfy.c +0 -2483
  1173. data/third_party/boringssl/crypto/x509/x509_vpm.c +0 -672
  1174. data/third_party/boringssl/crypto/x509/x509name.c +0 -388
  1175. data/third_party/boringssl/crypto/x509/x_all.c +0 -400
  1176. data/third_party/boringssl/crypto/x509v3/v3_alt.c +0 -629
  1177. data/third_party/boringssl/crypto/x509v3/v3_enum.c +0 -100
  1178. data/third_party/boringssl/crypto/x509v3/v3_info.c +0 -219
  1179. data/third_party/boringssl/crypto/x509v3/v3_purp.c +0 -844
  1180. data/third_party/boringssl/crypto/x509v3/v3_utl.c +0 -1396
  1181. data/third_party/boringssl/include/openssl/base.h +0 -571
  1182. data/third_party/boringssl/include/openssl/bn.h +0 -1045
  1183. data/third_party/boringssl/include/openssl/buf.h +0 -137
  1184. data/third_party/boringssl/include/openssl/bytestring.h +0 -527
  1185. data/third_party/boringssl/include/openssl/crypto.h +0 -144
  1186. data/third_party/boringssl/include/openssl/dh.h +0 -299
  1187. data/third_party/boringssl/include/openssl/digest.h +0 -330
  1188. data/third_party/boringssl/include/openssl/dsa.h +0 -441
  1189. data/third_party/boringssl/include/openssl/ec.h +0 -417
  1190. data/third_party/boringssl/include/openssl/ec_key.h +0 -370
  1191. data/third_party/boringssl/include/openssl/ecdsa.h +0 -199
  1192. data/third_party/boringssl/include/openssl/err.h +0 -461
  1193. data/third_party/boringssl/include/openssl/evp.h +0 -1030
  1194. data/third_party/boringssl/include/openssl/mem.h +0 -160
  1195. data/third_party/boringssl/include/openssl/nid.h +0 -4245
  1196. data/third_party/boringssl/include/openssl/poly1305.h +0 -51
  1197. data/third_party/boringssl/include/openssl/rand.h +0 -125
  1198. data/third_party/boringssl/include/openssl/rsa.h +0 -787
  1199. data/third_party/boringssl/include/openssl/sha.h +0 -268
  1200. data/third_party/boringssl/include/openssl/ssl.h +0 -5113
  1201. data/third_party/boringssl/include/openssl/tls1.h +0 -634
  1202. data/third_party/boringssl/include/openssl/x509.h +0 -1205
  1203. data/third_party/boringssl/include/openssl/x509_vfy.h +0 -680
  1204. data/third_party/boringssl/ssl/d1_both.cc +0 -842
  1205. data/third_party/boringssl/ssl/d1_lib.cc +0 -268
  1206. data/third_party/boringssl/ssl/d1_pkt.cc +0 -274
  1207. data/third_party/boringssl/ssl/dtls_method.cc +0 -192
  1208. data/third_party/boringssl/ssl/handoff.cc +0 -489
  1209. data/third_party/boringssl/ssl/handshake.cc +0 -691
  1210. data/third_party/boringssl/ssl/handshake_client.cc +0 -1871
  1211. data/third_party/boringssl/ssl/handshake_server.cc +0 -1801
  1212. data/third_party/boringssl/ssl/internal.h +0 -3549
  1213. data/third_party/boringssl/ssl/s3_both.cc +0 -724
  1214. data/third_party/boringssl/ssl/s3_lib.cc +0 -222
  1215. data/third_party/boringssl/ssl/s3_pkt.cc +0 -459
  1216. data/third_party/boringssl/ssl/ssl_asn1.cc +0 -828
  1217. data/third_party/boringssl/ssl/ssl_buffer.cc +0 -287
  1218. data/third_party/boringssl/ssl/ssl_cert.cc +0 -1016
  1219. data/third_party/boringssl/ssl/ssl_cipher.cc +0 -1719
  1220. data/third_party/boringssl/ssl/ssl_lib.cc +0 -3011
  1221. data/third_party/boringssl/ssl/ssl_privkey.cc +0 -824
  1222. data/third_party/boringssl/ssl/ssl_session.cc +0 -1273
  1223. data/third_party/boringssl/ssl/ssl_stat.cc +0 -224
  1224. data/third_party/boringssl/ssl/ssl_versions.cc +0 -394
  1225. data/third_party/boringssl/ssl/t1_enc.cc +0 -361
  1226. data/third_party/boringssl/ssl/t1_lib.cc +0 -4036
  1227. data/third_party/boringssl/ssl/tls13_both.cc +0 -689
  1228. data/third_party/boringssl/ssl/tls13_client.cc +0 -947
  1229. data/third_party/boringssl/ssl/tls13_enc.cc +0 -561
  1230. data/third_party/boringssl/ssl/tls13_server.cc +0 -1089
  1231. data/third_party/boringssl/ssl/tls_method.cc +0 -279
  1232. data/third_party/boringssl/ssl/tls_record.cc +0 -698
  1233. data/third_party/boringssl/third_party/fiat/curve25519.c +0 -2167
  1234. data/third_party/boringssl/third_party/fiat/curve25519_32.h +0 -911
  1235. data/third_party/boringssl/third_party/fiat/curve25519_64.h +0 -559
  1236. data/third_party/boringssl/third_party/fiat/curve25519_tables.h +0 -7880
  1237. data/third_party/boringssl/third_party/fiat/internal.h +0 -154
  1238. data/third_party/boringssl/third_party/fiat/p256.c +0 -1063
  1239. data/third_party/boringssl/third_party/fiat/p256_32.h +0 -3226
  1240. data/third_party/boringssl/third_party/fiat/p256_64.h +0 -1217
@@ -19,11 +19,14 @@
19
19
 
20
20
  #include <grpc/support/port_platform.h>
21
21
 
22
+ #include <memory>
23
+ #include <string>
22
24
  #include <vector>
23
25
 
26
+ #include "absl/container/inlined_vector.h"
27
+
24
28
  #include <grpc/impl/codegen/slice.h>
25
29
 
26
- #include "src/core/lib/gprpp/inlined_vector.h"
27
30
  #include "src/core/lib/gprpp/map.h"
28
31
  #include "src/core/lib/gprpp/memory.h"
29
32
  #include "src/core/lib/iomgr/error.h"
@@ -31,67 +34,52 @@
31
34
 
32
35
  namespace grpc_core {
33
36
 
37
+ class XdsClient;
38
+
34
39
  class XdsBootstrap {
35
40
  public:
36
- struct MetadataValue {
37
- enum class Type { MD_NULL, DOUBLE, STRING, BOOL, STRUCT, LIST };
38
- Type type = Type::MD_NULL;
39
- // TODO(roth): Once we can use C++17, these can be in a std::variant.
40
- double double_value;
41
- const char* string_value;
42
- bool bool_value;
43
- std::map<const char*, MetadataValue, StringLess> struct_value;
44
- std::vector<MetadataValue> list_value;
45
- };
46
-
47
41
  struct Node {
48
- const char* id = nullptr;
49
- const char* cluster = nullptr;
50
- const char* locality_region = nullptr;
51
- const char* locality_zone = nullptr;
52
- const char* locality_subzone = nullptr;
53
- std::map<const char*, MetadataValue, StringLess> metadata;
42
+ std::string id;
43
+ std::string cluster;
44
+ std::string locality_region;
45
+ std::string locality_zone;
46
+ std::string locality_subzone;
47
+ Json metadata;
54
48
  };
55
49
 
56
50
  struct ChannelCreds {
57
- const char* type = nullptr;
58
- grpc_json* config = nullptr;
51
+ std::string type;
52
+ Json config;
53
+ };
54
+
55
+ struct XdsServer {
56
+ std::string server_uri;
57
+ absl::InlinedVector<ChannelCreds, 1> channel_creds;
59
58
  };
60
59
 
61
60
  // If *error is not GRPC_ERROR_NONE after returning, then there was an
62
61
  // error reading the file.
63
- static std::unique_ptr<XdsBootstrap> ReadFromFile(grpc_error** error);
62
+ static std::unique_ptr<XdsBootstrap> ReadFromFile(XdsClient* client,
63
+ TraceFlag* tracer,
64
+ grpc_error** error);
64
65
 
65
66
  // Do not instantiate directly -- use ReadFromFile() above instead.
66
- XdsBootstrap(grpc_slice contents, grpc_error** error);
67
- ~XdsBootstrap();
67
+ XdsBootstrap(Json json, grpc_error** error);
68
68
 
69
- const char* server_uri() const { return server_uri_; }
70
- const InlinedVector<ChannelCreds, 1>& channel_creds() const {
71
- return channel_creds_;
72
- }
69
+ // TODO(roth): We currently support only one server. Fix this when we
70
+ // add support for fallback for the xds channel.
71
+ const XdsServer& server() const { return servers_[0]; }
73
72
  const Node* node() const { return node_.get(); }
74
73
 
75
74
  private:
76
- grpc_error* ParseXdsServer(grpc_json* json);
77
- grpc_error* ParseChannelCredsArray(grpc_json* json);
78
- grpc_error* ParseChannelCreds(grpc_json* json, size_t idx);
79
- grpc_error* ParseNode(grpc_json* json);
80
- grpc_error* ParseLocality(grpc_json* json);
81
-
82
- InlinedVector<grpc_error*, 1> ParseMetadataStruct(
83
- grpc_json* json,
84
- std::map<const char*, MetadataValue, StringLess>* result);
85
- InlinedVector<grpc_error*, 1> ParseMetadataList(
86
- grpc_json* json, std::vector<MetadataValue>* result);
87
- grpc_error* ParseMetadataValue(grpc_json* json, size_t idx,
88
- MetadataValue* result);
89
-
90
- grpc_slice contents_;
91
- grpc_json* tree_ = nullptr;
92
-
93
- const char* server_uri_ = nullptr;
94
- InlinedVector<ChannelCreds, 1> channel_creds_;
75
+ grpc_error* ParseXdsServerList(Json* json);
76
+ grpc_error* ParseXdsServer(Json* json, size_t idx);
77
+ grpc_error* ParseChannelCredsArray(Json* json, XdsServer* server);
78
+ grpc_error* ParseChannelCreds(Json* json, size_t idx, XdsServer* server);
79
+ grpc_error* ParseNode(Json* json);
80
+ grpc_error* ParseLocality(Json* json);
81
+
82
+ absl::InlinedVector<XdsServer, 1> servers_;
95
83
  std::unique_ptr<Node> node_;
96
84
  };
97
85
 
@@ -24,6 +24,7 @@
24
24
  #include <grpc/impl/codegen/grpc_types.h>
25
25
 
26
26
  #include "src/core/ext/filters/client_channel/xds/xds_bootstrap.h"
27
+ #include "src/core/lib/iomgr/error.h"
27
28
 
28
29
  namespace grpc_core {
29
30
 
@@ -36,7 +37,8 @@ namespace grpc_core {
36
37
  grpc_channel_args* ModifyXdsChannelArgs(grpc_channel_args* args);
37
38
 
38
39
  grpc_channel* CreateXdsChannel(const XdsBootstrap& bootstrap,
39
- const grpc_channel_args& args);
40
+ const grpc_channel_args& args,
41
+ grpc_error** error);
40
42
 
41
43
  } // namespace grpc_core
42
44
 
@@ -22,6 +22,8 @@
22
22
 
23
23
  #include <string.h>
24
24
 
25
+ #include "absl/container/inlined_vector.h"
26
+
25
27
  #include <grpc/grpc_security.h>
26
28
  #include <grpc/support/alloc.h>
27
29
  #include <grpc/support/string_util.h>
@@ -39,8 +41,8 @@
39
41
  namespace grpc_core {
40
42
 
41
43
  grpc_channel_args* ModifyXdsChannelArgs(grpc_channel_args* args) {
42
- InlinedVector<const char*, 1> args_to_remove;
43
- InlinedVector<grpc_arg, 2> args_to_add;
44
+ absl::InlinedVector<const char*, 1> args_to_remove;
45
+ absl::InlinedVector<grpc_arg, 2> args_to_add;
44
46
  // Substitute the channel credentials with a version without call
45
47
  // credentials: the load balancer is not necessarily trusted to handle
46
48
  // bearer token credentials.
@@ -64,34 +66,39 @@ grpc_channel_args* ModifyXdsChannelArgs(grpc_channel_args* args) {
64
66
  }
65
67
 
66
68
  grpc_channel* CreateXdsChannel(const XdsBootstrap& bootstrap,
67
- const grpc_channel_args& args) {
69
+ const grpc_channel_args& args,
70
+ grpc_error** error) {
68
71
  grpc_channel_credentials* creds = nullptr;
69
72
  RefCountedPtr<grpc_channel_credentials> creds_to_unref;
70
- if (!bootstrap.channel_creds().empty()) {
71
- for (size_t i = 0; i < bootstrap.channel_creds().size(); ++i) {
72
- if (strcmp(bootstrap.channel_creds()[i].type, "google_default") == 0) {
73
+ if (!bootstrap.server().channel_creds.empty()) {
74
+ for (size_t i = 0; i < bootstrap.server().channel_creds.size(); ++i) {
75
+ if (bootstrap.server().channel_creds[i].type == "google_default") {
73
76
  creds = grpc_google_default_credentials_create();
74
77
  break;
75
- } else if (strcmp(bootstrap.channel_creds()[i].type, "fake") == 0) {
78
+ } else if (bootstrap.server().channel_creds[i].type == "fake") {
76
79
  creds = grpc_fake_transport_security_credentials_create();
77
80
  break;
78
81
  }
79
82
  }
80
- if (creds == nullptr) return nullptr;
83
+ if (creds == nullptr) {
84
+ *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
85
+ "no supported credential types found");
86
+ return nullptr;
87
+ }
81
88
  creds_to_unref.reset(creds);
82
89
  } else {
83
90
  creds = grpc_channel_credentials_find_in_args(&args);
84
91
  if (creds == nullptr) {
85
92
  // Built with security but parent channel is insecure.
86
- return grpc_insecure_channel_create(bootstrap.server_uri(), &args,
87
- nullptr);
93
+ return grpc_insecure_channel_create(bootstrap.server().server_uri.c_str(),
94
+ &args, nullptr);
88
95
  }
89
96
  }
90
97
  const char* arg_to_remove = GRPC_ARG_CHANNEL_CREDENTIALS;
91
98
  grpc_channel_args* new_args =
92
99
  grpc_channel_args_copy_and_remove(&args, &arg_to_remove, 1);
93
100
  grpc_channel* channel = grpc_secure_channel_create(
94
- creds, bootstrap.server_uri(), new_args, nullptr);
101
+ creds, bootstrap.server().server_uri.c_str(), new_args, nullptr);
95
102
  grpc_channel_args_destroy(new_args);
96
103
  return channel;
97
104
  }
@@ -22,6 +22,11 @@
22
22
  #include <limits.h>
23
23
  #include <string.h>
24
24
 
25
+ #include "absl/container/inlined_vector.h"
26
+ #include "absl/strings/str_format.h"
27
+ #include "absl/strings/str_join.h"
28
+ #include "absl/strings/string_view.h"
29
+
25
30
  #include <grpc/byte_buffer_reader.h>
26
31
  #include <grpc/grpc.h>
27
32
  #include <grpc/support/alloc.h>
@@ -46,10 +51,10 @@
46
51
  #include "src/core/lib/gprpp/orphanable.h"
47
52
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
48
53
  #include "src/core/lib/gprpp/sync.h"
49
- #include "src/core/lib/iomgr/combiner.h"
50
54
  #include "src/core/lib/iomgr/sockaddr.h"
51
55
  #include "src/core/lib/iomgr/sockaddr_utils.h"
52
56
  #include "src/core/lib/iomgr/timer.h"
57
+ #include "src/core/lib/iomgr/work_serializer.h"
53
58
  #include "src/core/lib/slice/slice_hash_table.h"
54
59
  #include "src/core/lib/slice/slice_internal.h"
55
60
  #include "src/core/lib/slice/slice_string_helpers.h"
@@ -93,7 +98,7 @@ class XdsClient::ChannelState::RetryableCall
93
98
  void StartNewCallLocked();
94
99
  void StartRetryTimerLocked();
95
100
  static void OnRetryTimer(void* arg, grpc_error* error);
96
- static void OnRetryTimerLocked(void* arg, grpc_error* error);
101
+ void OnRetryTimerLocked(grpc_error* error);
97
102
 
98
103
  // The wrapped xds call that talks to the xds server. It's instantiated
99
104
  // every time we start a new call. It's null during call retry backoff.
@@ -125,16 +130,138 @@ class XdsClient::ChannelState::AdsCallState
125
130
  XdsClient* xds_client() const { return chand()->xds_client(); }
126
131
  bool seen_response() const { return seen_response_; }
127
132
 
133
+ void Subscribe(const std::string& type_url, const std::string& name);
134
+ void Unsubscribe(const std::string& type_url, const std::string& name,
135
+ bool delay_unsubscription);
136
+
137
+ bool HasSubscribedResources() const;
138
+
128
139
  private:
140
+ class ResourceState : public InternallyRefCounted<ResourceState> {
141
+ public:
142
+ ResourceState(const std::string& type_url, const std::string& name)
143
+ : type_url_(type_url), name_(name) {
144
+ GRPC_CLOSURE_INIT(&timer_callback_, OnTimer, this,
145
+ grpc_schedule_on_exec_ctx);
146
+ }
147
+
148
+ void Orphan() override {
149
+ Finish();
150
+ Unref();
151
+ }
152
+
153
+ void Start(RefCountedPtr<AdsCallState> ads_calld) {
154
+ if (sent_) return;
155
+ sent_ = true;
156
+ ads_calld_ = std::move(ads_calld);
157
+ Ref().release();
158
+ timer_pending_ = true;
159
+ grpc_timer_init(
160
+ &timer_,
161
+ ExecCtx::Get()->Now() + ads_calld_->xds_client()->request_timeout_,
162
+ &timer_callback_);
163
+ }
164
+
165
+ void Finish() {
166
+ if (timer_pending_) {
167
+ grpc_timer_cancel(&timer_);
168
+ timer_pending_ = false;
169
+ }
170
+ }
171
+
172
+ private:
173
+ static void OnTimer(void* arg, grpc_error* error) {
174
+ ResourceState* self = static_cast<ResourceState*>(arg);
175
+ GRPC_ERROR_REF(error); // ref owned by lambda
176
+ self->ads_calld_->xds_client()->work_serializer_->Run(
177
+ [self, error]() { self->OnTimerLocked(error); }, DEBUG_LOCATION);
178
+ }
179
+
180
+ void OnTimerLocked(grpc_error* error) {
181
+ if (error == GRPC_ERROR_NONE && timer_pending_) {
182
+ timer_pending_ = false;
183
+ char* msg;
184
+ gpr_asprintf(
185
+ &msg,
186
+ "timeout obtaining resource {type=%s name=%s} from xds server",
187
+ type_url_.c_str(), name_.c_str());
188
+ grpc_error* watcher_error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg);
189
+ gpr_free(msg);
190
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
191
+ gpr_log(GPR_INFO, "[xds_client %p] %s", ads_calld_->xds_client(),
192
+ grpc_error_string(watcher_error));
193
+ }
194
+ if (type_url_ == XdsApi::kLdsTypeUrl ||
195
+ type_url_ == XdsApi::kRdsTypeUrl) {
196
+ ads_calld_->xds_client()->service_config_watcher_->OnError(
197
+ watcher_error);
198
+ } else if (type_url_ == XdsApi::kCdsTypeUrl) {
199
+ ClusterState& state = ads_calld_->xds_client()->cluster_map_[name_];
200
+ for (const auto& p : state.watchers) {
201
+ p.first->OnError(GRPC_ERROR_REF(watcher_error));
202
+ }
203
+ GRPC_ERROR_UNREF(watcher_error);
204
+ } else if (type_url_ == XdsApi::kEdsTypeUrl) {
205
+ EndpointState& state = ads_calld_->xds_client()->endpoint_map_[name_];
206
+ for (const auto& p : state.watchers) {
207
+ p.first->OnError(GRPC_ERROR_REF(watcher_error));
208
+ }
209
+ GRPC_ERROR_UNREF(watcher_error);
210
+ } else {
211
+ GPR_UNREACHABLE_CODE(return );
212
+ }
213
+ }
214
+ ads_calld_.reset();
215
+ Unref();
216
+ GRPC_ERROR_UNREF(error);
217
+ }
218
+
219
+ const std::string type_url_;
220
+ const std::string name_;
221
+
222
+ RefCountedPtr<AdsCallState> ads_calld_;
223
+ bool sent_ = false;
224
+ bool timer_pending_ = false;
225
+ grpc_timer timer_;
226
+ grpc_closure timer_callback_;
227
+ };
228
+
229
+ struct ResourceTypeState {
230
+ ~ResourceTypeState() { GRPC_ERROR_UNREF(error); }
231
+
232
+ // Version, nonce, and error for this resource type.
233
+ std::string version;
234
+ std::string nonce;
235
+ grpc_error* error = GRPC_ERROR_NONE;
236
+
237
+ // Subscribed resources of this type.
238
+ std::map<std::string /* name */, OrphanablePtr<ResourceState>>
239
+ subscribed_resources;
240
+ };
241
+
242
+ void SendMessageLocked(const std::string& type_url);
243
+
244
+ void AcceptLdsUpdate(absl::optional<XdsApi::LdsUpdate> lds_update);
245
+ void AcceptRdsUpdate(absl::optional<XdsApi::RdsUpdate> rds_update);
246
+ void AcceptCdsUpdate(XdsApi::CdsUpdateMap cds_update_map);
247
+ void AcceptEdsUpdate(XdsApi::EdsUpdateMap eds_update_map);
248
+
249
+ static void OnRequestSent(void* arg, grpc_error* error);
250
+ void OnRequestSentLocked(grpc_error* error);
129
251
  static void OnResponseReceived(void* arg, grpc_error* error);
252
+ void OnResponseReceivedLocked();
130
253
  static void OnStatusReceived(void* arg, grpc_error* error);
131
- static void OnResponseReceivedLocked(void* arg, grpc_error* error);
132
- static void OnStatusReceivedLocked(void* arg, grpc_error* error);
254
+ void OnStatusReceivedLocked(grpc_error* error);
133
255
 
134
256
  bool IsCurrentCallOnChannel() const;
135
257
 
258
+ std::set<absl::string_view> ResourceNamesForRequest(
259
+ const std::string& type_url);
260
+
136
261
  // The owning RetryableCall<>.
137
262
  RefCountedPtr<RetryableCall<AdsCallState>> parent_;
263
+
264
+ bool sent_initial_message_ = false;
138
265
  bool seen_response_ = false;
139
266
 
140
267
  // Always non-NULL.
@@ -145,6 +272,7 @@ class XdsClient::ChannelState::AdsCallState
145
272
 
146
273
  // send_message
147
274
  grpc_byte_buffer* send_message_payload_ = nullptr;
275
+ grpc_closure on_request_sent_;
148
276
 
149
277
  // recv_message
150
278
  grpc_byte_buffer* recv_message_payload_ = nullptr;
@@ -155,6 +283,12 @@ class XdsClient::ChannelState::AdsCallState
155
283
  grpc_status_code status_code_;
156
284
  grpc_slice status_details_;
157
285
  grpc_closure on_status_received_;
286
+
287
+ // Resource types for which requests need to be sent.
288
+ std::set<std::string /*type_url*/> buffered_requests_;
289
+
290
+ // State for each resource type.
291
+ std::map<std::string /*type_url*/, ResourceTypeState> state_map_;
158
292
  };
159
293
 
160
294
  // Contains an LRS call to the xds server.
@@ -180,6 +314,10 @@ class XdsClient::ChannelState::LrsCallState
180
314
  public:
181
315
  Reporter(RefCountedPtr<LrsCallState> parent, grpc_millis report_interval)
182
316
  : parent_(std::move(parent)), report_interval_(report_interval) {
317
+ GRPC_CLOSURE_INIT(&on_next_report_timer_, OnNextReportTimer, this,
318
+ grpc_schedule_on_exec_ctx);
319
+ GRPC_CLOSURE_INIT(&on_report_done_, OnReportDone, this,
320
+ grpc_schedule_on_exec_ctx);
183
321
  ScheduleNextReportLocked();
184
322
  }
185
323
 
@@ -188,10 +326,10 @@ class XdsClient::ChannelState::LrsCallState
188
326
  private:
189
327
  void ScheduleNextReportLocked();
190
328
  static void OnNextReportTimer(void* arg, grpc_error* error);
191
- static void OnNextReportTimerLocked(void* arg, grpc_error* error);
329
+ void OnNextReportTimerLocked(grpc_error* error);
192
330
  void SendReportLocked();
193
331
  static void OnReportDone(void* arg, grpc_error* error);
194
- static void OnReportDoneLocked(void* arg, grpc_error* error);
332
+ void OnReportDoneLocked(grpc_error* error);
195
333
 
196
334
  bool IsCurrentReporterOnCall() const {
197
335
  return this == parent_->reporter_.get();
@@ -211,11 +349,11 @@ class XdsClient::ChannelState::LrsCallState
211
349
  };
212
350
 
213
351
  static void OnInitialRequestSent(void* arg, grpc_error* error);
352
+ void OnInitialRequestSentLocked();
214
353
  static void OnResponseReceived(void* arg, grpc_error* error);
354
+ void OnResponseReceivedLocked();
215
355
  static void OnStatusReceived(void* arg, grpc_error* error);
216
- static void OnInitialRequestSentLocked(void* arg, grpc_error* error);
217
- static void OnResponseReceivedLocked(void* arg, grpc_error* error);
218
- static void OnStatusReceivedLocked(void* arg, grpc_error* error);
356
+ void OnStatusReceivedLocked(grpc_error* error);
219
357
 
220
358
  bool IsCurrentCallOnChannel() const;
221
359
 
@@ -244,7 +382,8 @@ class XdsClient::ChannelState::LrsCallState
244
382
  grpc_closure on_status_received_;
245
383
 
246
384
  // Load reporting state.
247
- grpc_core::UniquePtr<char> cluster_name_;
385
+ bool send_all_clusters_ = false;
386
+ std::set<std::string> cluster_names_; // Asked for by the LRS server.
248
387
  grpc_millis load_reporting_interval_ = 0;
249
388
  OrphanablePtr<Reporter> reporter_;
250
389
  };
@@ -257,7 +396,8 @@ class XdsClient::ChannelState::StateWatcher
257
396
  : public AsyncConnectivityStateWatcherInterface {
258
397
  public:
259
398
  explicit StateWatcher(RefCountedPtr<ChannelState> parent)
260
- : AsyncConnectivityStateWatcherInterface(parent->xds_client()->combiner_),
399
+ : AsyncConnectivityStateWatcherInterface(
400
+ parent->xds_client()->work_serializer_),
261
401
  parent_(std::move(parent)) {}
262
402
 
263
403
  private:
@@ -306,9 +446,14 @@ grpc_channel_args* BuildXdsChannelArgs(const grpc_channel_args& args) {
306
446
  // Don't want to pass down channelz node from parent; the balancer
307
447
  // channel will get its own.
308
448
  GRPC_ARG_CHANNELZ_CHANNEL_NODE,
449
+ // Keepalive interval. We are explicitly setting our own value below.
450
+ GRPC_ARG_KEEPALIVE_TIME_MS,
309
451
  };
310
452
  // Channel args to add.
311
- InlinedVector<grpc_arg, 2> args_to_add;
453
+ absl::InlinedVector<grpc_arg, 3> args_to_add;
454
+ // Keepalive interval.
455
+ args_to_add.emplace_back(grpc_channel_arg_integer_create(
456
+ const_cast<char*>(GRPC_ARG_KEEPALIVE_TIME_MS), 5000));
312
457
  // A channel arg indicating that the target is an xds server.
313
458
  // TODO(roth): Once we figure out our fallback and credentials story, decide
314
459
  // whether this is actually needed. Note that it's currently used by the
@@ -336,12 +481,10 @@ grpc_channel_args* BuildXdsChannelArgs(const grpc_channel_args& args) {
336
481
  } // namespace
337
482
 
338
483
  XdsClient::ChannelState::ChannelState(RefCountedPtr<XdsClient> xds_client,
339
- const grpc_channel_args& args)
484
+ grpc_channel* channel)
340
485
  : InternallyRefCounted<ChannelState>(&grpc_xds_client_trace),
341
- xds_client_(std::move(xds_client)) {
342
- grpc_channel_args* new_args = BuildXdsChannelArgs(args);
343
- channel_ = CreateXdsChannel(*xds_client_->bootstrap_, *new_args);
344
- grpc_channel_args_destroy(new_args);
486
+ xds_client_(std::move(xds_client)),
487
+ channel_(channel) {
345
488
  GPR_ASSERT(channel_ != nullptr);
346
489
  StartConnectivityWatchLocked();
347
490
  }
@@ -376,14 +519,6 @@ bool XdsClient::ChannelState::HasActiveAdsCall() const {
376
519
  return ads_calld_->calld() != nullptr;
377
520
  }
378
521
 
379
- void XdsClient::ChannelState::MaybeStartAdsCall() {
380
- if (ads_calld_ != nullptr) return;
381
- ads_calld_.reset(
382
- new RetryableCall<AdsCallState>(Ref(DEBUG_LOCATION, "ChannelState+ads")));
383
- }
384
-
385
- void XdsClient::ChannelState::StopAdsCall() { ads_calld_.reset(); }
386
-
387
522
  void XdsClient::ChannelState::MaybeStartLrsCall() {
388
523
  if (lrs_calld_ != nullptr) return;
389
524
  lrs_calld_.reset(
@@ -409,6 +544,33 @@ void XdsClient::ChannelState::CancelConnectivityWatchLocked() {
409
544
  grpc_client_channel_stop_connectivity_watch(client_channel_elem, watcher_);
410
545
  }
411
546
 
547
+ void XdsClient::ChannelState::Subscribe(const std::string& type_url,
548
+ const std::string& name) {
549
+ if (ads_calld_ == nullptr) {
550
+ // Start the ADS call if this is the first request.
551
+ ads_calld_.reset(new RetryableCall<AdsCallState>(
552
+ Ref(DEBUG_LOCATION, "ChannelState+ads")));
553
+ // Note: AdsCallState's ctor will automatically subscribe to all
554
+ // resources that the XdsClient already has watchers for, so we can
555
+ // return here.
556
+ return;
557
+ }
558
+ // If the ADS call is in backoff state, we don't need to do anything now
559
+ // because when the call is restarted it will resend all necessary requests.
560
+ if (ads_calld() == nullptr) return;
561
+ // Subscribe to this resource if the ADS call is active.
562
+ ads_calld()->Subscribe(type_url, name);
563
+ }
564
+
565
+ void XdsClient::ChannelState::Unsubscribe(const std::string& type_url,
566
+ const std::string& name,
567
+ bool delay_unsubscription) {
568
+ if (ads_calld_ != nullptr) {
569
+ ads_calld_->calld()->Unsubscribe(type_url, name, delay_unsubscription);
570
+ if (!ads_calld_->calld()->HasSubscribedResources()) ads_calld_.reset();
571
+ }
572
+ }
573
+
412
574
  //
413
575
  // XdsClient::ChannelState::RetryableCall<>
414
576
  //
@@ -424,6 +586,9 @@ XdsClient::ChannelState::RetryableCall::RetryableCall(
424
586
  .set_multiplier(GRPC_XDS_RECONNECT_BACKOFF_MULTIPLIER)
425
587
  .set_jitter(GRPC_XDS_RECONNECT_JITTER)
426
588
  .set_max_backoff(GRPC_XDS_RECONNECT_MAX_BACKOFF_SECONDS * 1000)) {
589
+ // Closure Initialization
590
+ GRPC_CLOSURE_INIT(&on_retry_timer_, OnRetryTimer, this,
591
+ grpc_schedule_on_exec_ctx);
427
592
  StartNewCallLocked();
428
593
  }
429
594
 
@@ -477,8 +642,6 @@ void XdsClient::ChannelState::RetryableCall::StartRetryTimerLocked() {
477
642
  chand()->xds_client(), chand(), timeout);
478
643
  }
479
644
  this->Ref(DEBUG_LOCATION, "RetryableCall+retry_timer_start").release();
480
- GRPC_CLOSURE_INIT(&on_retry_timer_, OnRetryTimer, this,
481
- grpc_schedule_on_exec_ctx);
482
645
  grpc_timer_init(&retry_timer_, next_attempt_time, &on_retry_timer_);
483
646
  retry_timer_callback_pending_ = true;
484
647
  }
@@ -487,27 +650,26 @@ template
487
650
  void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimer(
488
651
  void* arg, grpc_error* error) {
489
652
  RetryableCall* calld = static_cast<RetryableCall*>(arg);
490
- calld->chand_->xds_client()->combiner_->Run(
491
- GRPC_CLOSURE_INIT(&calld->on_retry_timer_, OnRetryTimerLocked, calld,
492
- nullptr),
493
- GRPC_ERROR_REF(error));
653
+ GRPC_ERROR_REF(error); // ref owned by lambda
654
+ calld->chand_->xds_client()->work_serializer_->Run(
655
+ [calld, error]() { calld->OnRetryTimerLocked(error); }, DEBUG_LOCATION);
494
656
  }
495
657
 
496
658
  template <typename T>
497
659
  void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimerLocked(
498
- void* arg, grpc_error* error) {
499
- RetryableCall* calld = static_cast<RetryableCall*>(arg);
500
- calld->retry_timer_callback_pending_ = false;
501
- if (!calld->shutting_down_ && error == GRPC_ERROR_NONE) {
660
+ grpc_error* error) {
661
+ retry_timer_callback_pending_ = false;
662
+ if (!shutting_down_ && error == GRPC_ERROR_NONE) {
502
663
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
503
664
  gpr_log(
504
665
  GPR_INFO,
505
666
  "[xds_client %p] Retry timer fires (chand: %p, retryable call: %p)",
506
- calld->chand()->xds_client(), calld->chand(), calld);
667
+ chand()->xds_client(), chand(), this);
507
668
  }
508
- calld->StartNewCallLocked();
669
+ StartNewCallLocked();
509
670
  }
510
- calld->Unref(DEBUG_LOCATION, "RetryableCall+retry_timer_done");
671
+ this->Unref(DEBUG_LOCATION, "RetryableCall+retry_timer_done");
672
+ GRPC_ERROR_UNREF(error);
511
673
  }
512
674
 
513
675
  //
@@ -522,8 +684,7 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
522
684
  // activity in xds_client()->interested_parties_, which is comprised of
523
685
  // the polling entities from client_channel.
524
686
  GPR_ASSERT(xds_client() != nullptr);
525
- GPR_ASSERT(xds_client()->server_name_ != nullptr);
526
- GPR_ASSERT(*xds_client()->server_name_.get() != '\0');
687
+ GPR_ASSERT(!xds_client()->server_name_.empty());
527
688
  // Create a call with the specified method name.
528
689
  call_ = grpc_channel_create_pollset_set_call(
529
690
  chand()->channel_, nullptr, GRPC_PROPAGATE_DEFAULTS,
@@ -531,14 +692,7 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
531
692
  GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_DISCOVERY_DOT_V2_DOT_AGGREGATEDDISCOVERYSERVICE_SLASH_STREAMAGGREGATEDRESOURCES,
532
693
  nullptr, GRPC_MILLIS_INF_FUTURE, nullptr);
533
694
  GPR_ASSERT(call_ != nullptr);
534
- // Init the request payload.
535
- grpc_slice request_payload_slice = XdsEdsRequestCreateAndEncode(
536
- xds_client()->server_name_.get(), xds_client()->bootstrap_->node(),
537
- xds_client()->build_version_.get());
538
- send_message_payload_ =
539
- grpc_raw_byte_buffer_create(&request_payload_slice, 1);
540
- grpc_slice_unref_internal(request_payload_slice);
541
- // Init other data associated with the call.
695
+ // Init data associated with the call.
542
696
  grpc_metadata_array_init(&initial_metadata_recv_);
543
697
  grpc_metadata_array_init(&trailing_metadata_recv_);
544
698
  // Start the call.
@@ -556,19 +710,30 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
556
710
  grpc_op* op = ops;
557
711
  op->op = GRPC_OP_SEND_INITIAL_METADATA;
558
712
  op->data.send_initial_metadata.count = 0;
559
- op->flags = 0;
560
- op->reserved = nullptr;
561
- op++;
562
- // Op: send request message.
563
- GPR_ASSERT(send_message_payload_ != nullptr);
564
- op->op = GRPC_OP_SEND_MESSAGE;
565
- op->data.send_message.send_message = send_message_payload_;
566
- op->flags = 0;
713
+ op->flags = GRPC_INITIAL_METADATA_WAIT_FOR_READY |
714
+ GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET;
567
715
  op->reserved = nullptr;
568
716
  op++;
569
717
  call_error = grpc_call_start_batch_and_execute(call_, ops, (size_t)(op - ops),
570
718
  nullptr);
571
719
  GPR_ASSERT(GRPC_CALL_OK == call_error);
720
+ // Op: send request message.
721
+ GRPC_CLOSURE_INIT(&on_request_sent_, OnRequestSent, this,
722
+ grpc_schedule_on_exec_ctx);
723
+ if (xds_client()->service_config_watcher_ != nullptr) {
724
+ Subscribe(XdsApi::kLdsTypeUrl, xds_client()->server_name_);
725
+ if (xds_client()->lds_result_.has_value() &&
726
+ !xds_client()->lds_result_->route_config_name.empty()) {
727
+ Subscribe(XdsApi::kRdsTypeUrl,
728
+ xds_client()->lds_result_->route_config_name);
729
+ }
730
+ }
731
+ for (const auto& p : xds_client()->cluster_map_) {
732
+ Subscribe(XdsApi::kCdsTypeUrl, std::string(p.first));
733
+ }
734
+ for (const auto& p : xds_client()->endpoint_map_) {
735
+ Subscribe(XdsApi::kEdsTypeUrl, std::string(p.first));
736
+ }
572
737
  // Op: recv initial metadata.
573
738
  op = ops;
574
739
  op->op = GRPC_OP_RECV_INITIAL_METADATA;
@@ -625,199 +790,535 @@ void XdsClient::ChannelState::AdsCallState::Orphan() {
625
790
  // we are here because xds_client has to orphan a failed call, then the
626
791
  // following cancellation will be a no-op.
627
792
  grpc_call_cancel(call_, nullptr);
793
+ state_map_.clear();
628
794
  // Note that the initial ref is hold by on_status_received_. So the
629
795
  // corresponding unref happens in on_status_received_ instead of here.
630
796
  }
631
797
 
632
- void XdsClient::ChannelState::AdsCallState::OnResponseReceived(
633
- void* arg, grpc_error* error) {
634
- AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
635
- ads_calld->xds_client()->combiner_->Run(
636
- GRPC_CLOSURE_INIT(&ads_calld->on_response_received_,
637
- OnResponseReceivedLocked, ads_calld, nullptr),
638
- GRPC_ERROR_REF(error));
798
+ void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
799
+ const std::string& type_url) {
800
+ // Buffer message sending if an existing message is in flight.
801
+ if (send_message_payload_ != nullptr) {
802
+ buffered_requests_.insert(type_url);
803
+ return;
804
+ }
805
+ auto& state = state_map_[type_url];
806
+ grpc_slice request_payload_slice;
807
+ std::set<absl::string_view> resource_names =
808
+ ResourceNamesForRequest(type_url);
809
+ request_payload_slice = xds_client()->api_.CreateAdsRequest(
810
+ type_url, resource_names, state.version, state.nonce,
811
+ GRPC_ERROR_REF(state.error), !sent_initial_message_);
812
+ if (type_url != XdsApi::kLdsTypeUrl && type_url != XdsApi::kRdsTypeUrl &&
813
+ type_url != XdsApi::kCdsTypeUrl && type_url != XdsApi::kEdsTypeUrl) {
814
+ state_map_.erase(type_url);
815
+ }
816
+ sent_initial_message_ = true;
817
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
818
+ gpr_log(GPR_INFO,
819
+ "[xds_client %p] sending ADS request: type=%s version=%s nonce=%s "
820
+ "error=%s resources=%s",
821
+ xds_client(), type_url.c_str(), state.version.c_str(),
822
+ state.nonce.c_str(), grpc_error_string(state.error),
823
+ absl::StrJoin(resource_names, " ").c_str());
824
+ }
825
+ GRPC_ERROR_UNREF(state.error);
826
+ state.error = GRPC_ERROR_NONE;
827
+ // Create message payload.
828
+ send_message_payload_ =
829
+ grpc_raw_byte_buffer_create(&request_payload_slice, 1);
830
+ grpc_slice_unref_internal(request_payload_slice);
831
+ // Send the message.
832
+ grpc_op op;
833
+ memset(&op, 0, sizeof(op));
834
+ op.op = GRPC_OP_SEND_MESSAGE;
835
+ op.data.send_message.send_message = send_message_payload_;
836
+ Ref(DEBUG_LOCATION, "ADS+OnRequestSentLocked").release();
837
+ GRPC_CLOSURE_INIT(&on_request_sent_, OnRequestSent, this,
838
+ grpc_schedule_on_exec_ctx);
839
+ grpc_call_error call_error =
840
+ grpc_call_start_batch_and_execute(call_, &op, 1, &on_request_sent_);
841
+ if (GPR_UNLIKELY(call_error != GRPC_CALL_OK)) {
842
+ gpr_log(GPR_ERROR,
843
+ "[xds_client %p] calld=%p call_error=%d sending ADS message",
844
+ xds_client(), this, call_error);
845
+ GPR_ASSERT(GRPC_CALL_OK == call_error);
846
+ }
639
847
  }
640
848
 
641
- void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked(
642
- void* arg, grpc_error* /*error*/) {
643
- AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
644
- XdsClient* xds_client = ads_calld->xds_client();
645
- // Empty payload means the call was cancelled.
646
- if (!ads_calld->IsCurrentCallOnChannel() ||
647
- ads_calld->recv_message_payload_ == nullptr) {
648
- ads_calld->Unref(DEBUG_LOCATION, "ADS+OnResponseReceivedLocked");
849
+ void XdsClient::ChannelState::AdsCallState::Subscribe(
850
+ const std::string& type_url, const std::string& name) {
851
+ auto& state = state_map_[type_url].subscribed_resources[name];
852
+ if (state == nullptr) {
853
+ state = MakeOrphanable<ResourceState>(type_url, name);
854
+ SendMessageLocked(type_url);
855
+ }
856
+ }
857
+
858
+ void XdsClient::ChannelState::AdsCallState::Unsubscribe(
859
+ const std::string& type_url, const std::string& name,
860
+ bool delay_unsubscription) {
861
+ state_map_[type_url].subscribed_resources.erase(name);
862
+ if (!delay_unsubscription) SendMessageLocked(type_url);
863
+ }
864
+
865
+ bool XdsClient::ChannelState::AdsCallState::HasSubscribedResources() const {
866
+ for (const auto& p : state_map_) {
867
+ if (!p.second.subscribed_resources.empty()) return true;
868
+ }
869
+ return false;
870
+ }
871
+
872
+ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate(
873
+ absl::optional<XdsApi::LdsUpdate> lds_update) {
874
+ if (!lds_update.has_value()) {
875
+ gpr_log(GPR_INFO,
876
+ "[xds_client %p] LDS update does not include requested resource",
877
+ xds_client());
878
+ if (xds_client()->lds_result_.has_value() &&
879
+ !xds_client()->lds_result_->route_config_name.empty()) {
880
+ Unsubscribe(XdsApi::kRdsTypeUrl,
881
+ xds_client()->lds_result_->route_config_name,
882
+ /*delay_unsubscription=*/false);
883
+ xds_client()->rds_result_.reset();
884
+ }
885
+ xds_client()->lds_result_.reset();
886
+ xds_client()->service_config_watcher_->OnResourceDoesNotExist();
649
887
  return;
650
888
  }
651
- // Read the response.
652
- grpc_byte_buffer_reader bbr;
653
- grpc_byte_buffer_reader_init(&bbr, ads_calld->recv_message_payload_);
654
- grpc_slice response_slice = grpc_byte_buffer_reader_readall(&bbr);
655
- grpc_byte_buffer_reader_destroy(&bbr);
656
- grpc_byte_buffer_destroy(ads_calld->recv_message_payload_);
657
- ads_calld->recv_message_payload_ = nullptr;
658
- // TODO(juanlishen): When we convert this to use the xds protocol, the
659
- // balancer will send us a fallback timeout such that we should go into
660
- // fallback mode if we have lost contact with the balancer after a certain
661
- // period of time. We will need to save the timeout value here, and then
662
- // when the balancer call ends, we will need to start a timer for the
663
- // specified period of time, and if the timer fires, we go into fallback
664
- // mode. We will also need to cancel the timer when we receive a serverlist
665
- // from the balancer.
666
- // This anonymous lambda is a hack to avoid the usage of goto.
667
- [&]() {
668
- // Parse the response.
669
- EdsUpdate update;
670
- grpc_error* parse_error =
671
- XdsEdsResponseDecodeAndParse(response_slice, &update);
672
- if (parse_error != GRPC_ERROR_NONE) {
673
- gpr_log(GPR_ERROR,
674
- "[xds_client %p] ADS response parsing failed. error=%s",
675
- xds_client, grpc_error_string(parse_error));
676
- GRPC_ERROR_UNREF(parse_error);
677
- return;
889
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
890
+ gpr_log(GPR_INFO,
891
+ "[xds_client %p] LDS update received: route_config_name=%s",
892
+ xds_client(),
893
+ (!lds_update->route_config_name.empty()
894
+ ? lds_update->route_config_name.c_str()
895
+ : "<inlined>"));
896
+ if (lds_update->rds_update.has_value()) {
897
+ gpr_log(GPR_INFO, " RouteConfiguration contains %" PRIuPTR " routes",
898
+ lds_update->rds_update.value().routes.size());
899
+ for (const auto& route : lds_update->rds_update.value().routes) {
900
+ gpr_log(GPR_INFO,
901
+ " route: { service=\"%s\", "
902
+ "method=\"%s\" }, cluster=\"%s\" }",
903
+ route.service.c_str(), route.method.c_str(),
904
+ route.cluster_name.c_str());
905
+ }
678
906
  }
679
- if (update.priority_list_update.empty() && !update.drop_all) {
680
- char* response_slice_str =
681
- grpc_dump_slice(response_slice, GPR_DUMP_ASCII | GPR_DUMP_HEX);
682
- gpr_log(GPR_ERROR,
683
- "[xds_client %p] ADS response '%s' doesn't contain any valid "
684
- "locality but doesn't require to drop all calls. Ignoring.",
685
- xds_client, response_slice_str);
686
- gpr_free(response_slice_str);
687
- return;
907
+ }
908
+ auto& lds_state = state_map_[XdsApi::kLdsTypeUrl];
909
+ auto& state = lds_state.subscribed_resources[xds_client()->server_name_];
910
+ if (state != nullptr) state->Finish();
911
+ // Ignore identical update.
912
+ if (xds_client()->lds_result_ == lds_update) {
913
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
914
+ gpr_log(GPR_INFO,
915
+ "[xds_client %p] LDS update identical to current, ignoring.",
916
+ xds_client());
917
+ }
918
+ return;
919
+ }
920
+ if (xds_client()->lds_result_.has_value() &&
921
+ !xds_client()->lds_result_->route_config_name.empty()) {
922
+ Unsubscribe(
923
+ XdsApi::kRdsTypeUrl, xds_client()->lds_result_->route_config_name,
924
+ /*delay_unsubscription=*/!lds_update->route_config_name.empty());
925
+ xds_client()->rds_result_.reset();
926
+ }
927
+ xds_client()->lds_result_ = std::move(lds_update);
928
+ if (xds_client()->lds_result_->rds_update.has_value()) {
929
+ // If the RouteConfiguration was found inlined in LDS response, notify
930
+ // the watcher immediately.
931
+ RefCountedPtr<ServiceConfig> service_config;
932
+ grpc_error* error = xds_client()->CreateServiceConfig(
933
+ xds_client()->lds_result_->rds_update.value(), &service_config);
934
+ if (error == GRPC_ERROR_NONE) {
935
+ xds_client()->service_config_watcher_->OnServiceConfigChanged(
936
+ std::move(service_config));
937
+ } else {
938
+ xds_client()->service_config_watcher_->OnError(error);
939
+ }
940
+ } else {
941
+ // Send RDS request for dynamic resolution.
942
+ Subscribe(XdsApi::kRdsTypeUrl,
943
+ xds_client()->lds_result_->route_config_name);
944
+ }
945
+ }
946
+
947
+ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdate(
948
+ absl::optional<XdsApi::RdsUpdate> rds_update) {
949
+ if (!rds_update.has_value()) {
950
+ gpr_log(GPR_INFO,
951
+ "[xds_client %p] RDS update does not include requested resource",
952
+ xds_client());
953
+ xds_client()->rds_result_.reset();
954
+ xds_client()->service_config_watcher_->OnResourceDoesNotExist();
955
+ return;
956
+ }
957
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
958
+ gpr_log(GPR_INFO,
959
+ "[xds_client %p] RDS update received; RouteConfiguration contains "
960
+ "%" PRIuPTR " routes",
961
+ this, rds_update.value().routes.size());
962
+ for (const auto& route : rds_update.value().routes) {
963
+ gpr_log(GPR_INFO,
964
+ " route: { service=\"%s\", "
965
+ "method=\"%s\" }, cluster=\"%s\" }",
966
+ route.service.c_str(), route.method.c_str(),
967
+ route.cluster_name.c_str());
968
+ }
969
+ }
970
+ auto& rds_state = state_map_[XdsApi::kRdsTypeUrl];
971
+ auto& state =
972
+ rds_state
973
+ .subscribed_resources[xds_client()->lds_result_->route_config_name];
974
+ if (state != nullptr) state->Finish();
975
+ // Ignore identical update.
976
+ if (xds_client()->rds_result_ == rds_update) {
977
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
978
+ gpr_log(GPR_INFO,
979
+ "[xds_client %p] RDS update identical to current, ignoring.",
980
+ xds_client());
688
981
  }
689
- ads_calld->seen_response_ = true;
982
+ return;
983
+ }
984
+ xds_client()->rds_result_ = std::move(rds_update);
985
+ // Notify the watcher.
986
+ RefCountedPtr<ServiceConfig> service_config;
987
+ grpc_error* error = xds_client()->CreateServiceConfig(
988
+ xds_client()->rds_result_.value(), &service_config);
989
+ if (error == GRPC_ERROR_NONE) {
990
+ xds_client()->service_config_watcher_->OnServiceConfigChanged(
991
+ std::move(service_config));
992
+ } else {
993
+ xds_client()->service_config_watcher_->OnError(error);
994
+ }
995
+ }
996
+
997
+ void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdate(
998
+ XdsApi::CdsUpdateMap cds_update_map) {
999
+ auto& cds_state = state_map_[XdsApi::kCdsTypeUrl];
1000
+ std::set<std::string> eds_resource_names_seen;
1001
+ for (auto& p : cds_update_map) {
1002
+ const char* cluster_name = p.first.c_str();
1003
+ XdsApi::CdsUpdate& cds_update = p.second;
1004
+ auto& state = cds_state.subscribed_resources[cluster_name];
1005
+ if (state != nullptr) state->Finish();
690
1006
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
691
1007
  gpr_log(GPR_INFO,
692
- "[xds_client %p] ADS response with %" PRIuPTR
1008
+ "[xds_client %p] CDS update (cluster=%s) received: "
1009
+ "eds_service_name=%s, lrs_load_reporting_server_name=%s",
1010
+ xds_client(), cluster_name, cds_update.eds_service_name.c_str(),
1011
+ cds_update.lrs_load_reporting_server_name.has_value()
1012
+ ? cds_update.lrs_load_reporting_server_name.value().c_str()
1013
+ : "(N/A)");
1014
+ }
1015
+ // Record the EDS resource names seen.
1016
+ eds_resource_names_seen.insert(cds_update.eds_service_name.empty()
1017
+ ? cluster_name
1018
+ : cds_update.eds_service_name);
1019
+ // Ignore identical update.
1020
+ ClusterState& cluster_state = xds_client()->cluster_map_[cluster_name];
1021
+ if (cluster_state.update.has_value() &&
1022
+ cds_update.eds_service_name == cluster_state.update->eds_service_name &&
1023
+ cds_update.lrs_load_reporting_server_name ==
1024
+ cluster_state.update->lrs_load_reporting_server_name) {
1025
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1026
+ gpr_log(GPR_INFO,
1027
+ "[xds_client %p] CDS update identical to current, ignoring.",
1028
+ xds_client());
1029
+ }
1030
+ continue;
1031
+ }
1032
+ // Update the cluster state.
1033
+ cluster_state.update = std::move(cds_update);
1034
+ // Notify all watchers.
1035
+ for (const auto& p : cluster_state.watchers) {
1036
+ p.first->OnClusterChanged(cluster_state.update.value());
1037
+ }
1038
+ }
1039
+ // For any subscribed resource that is not present in the update,
1040
+ // remove it from the cache and notify watchers that it does not exist.
1041
+ for (const auto& p : cds_state.subscribed_resources) {
1042
+ const std::string& cluster_name = p.first;
1043
+ if (cds_update_map.find(cluster_name) == cds_update_map.end()) {
1044
+ ClusterState& cluster_state = xds_client()->cluster_map_[cluster_name];
1045
+ cluster_state.update.reset();
1046
+ for (const auto& p : cluster_state.watchers) {
1047
+ p.first->OnResourceDoesNotExist();
1048
+ }
1049
+ }
1050
+ }
1051
+ // For any EDS resource that is no longer referred to by any CDS
1052
+ // resources, remove it from the cache and notify watchers that it
1053
+ // does not exist.
1054
+ auto& eds_state = state_map_[XdsApi::kEdsTypeUrl];
1055
+ for (const auto& p : eds_state.subscribed_resources) {
1056
+ const std::string& eds_resource_name = p.first;
1057
+ if (eds_resource_names_seen.find(eds_resource_name) ==
1058
+ eds_resource_names_seen.end()) {
1059
+ EndpointState& endpoint_state =
1060
+ xds_client()->endpoint_map_[eds_resource_name];
1061
+ endpoint_state.update.reset();
1062
+ for (const auto& p : endpoint_state.watchers) {
1063
+ p.first->OnResourceDoesNotExist();
1064
+ }
1065
+ }
1066
+ }
1067
+ }
1068
+
1069
+ void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdate(
1070
+ XdsApi::EdsUpdateMap eds_update_map) {
1071
+ auto& eds_state = state_map_[XdsApi::kEdsTypeUrl];
1072
+ for (auto& p : eds_update_map) {
1073
+ const char* eds_service_name = p.first.c_str();
1074
+ XdsApi::EdsUpdate& eds_update = p.second;
1075
+ auto& state = eds_state.subscribed_resources[eds_service_name];
1076
+ if (state != nullptr) state->Finish();
1077
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1078
+ gpr_log(GPR_INFO,
1079
+ "[xds_client %p] EDS response with %" PRIuPTR
693
1080
  " priorities and %" PRIuPTR
694
1081
  " drop categories received (drop_all=%d)",
695
- xds_client, update.priority_list_update.size(),
696
- update.drop_config->drop_category_list().size(), update.drop_all);
697
- for (size_t priority = 0; priority < update.priority_list_update.size();
698
- ++priority) {
699
- const auto* locality_map_update =
700
- update.priority_list_update.Find(static_cast<uint32_t>(priority));
1082
+ xds_client(), eds_update.priority_list_update.size(),
1083
+ eds_update.drop_config->drop_category_list().size(),
1084
+ eds_update.drop_config->drop_all());
1085
+ for (size_t priority = 0;
1086
+ priority < eds_update.priority_list_update.size(); ++priority) {
1087
+ const auto* locality_map_update = eds_update.priority_list_update.Find(
1088
+ static_cast<uint32_t>(priority));
701
1089
  gpr_log(GPR_INFO,
702
1090
  "[xds_client %p] Priority %" PRIuPTR " contains %" PRIuPTR
703
1091
  " localities",
704
- xds_client, priority, locality_map_update->size());
1092
+ xds_client(), priority, locality_map_update->size());
705
1093
  size_t locality_count = 0;
706
1094
  for (const auto& p : locality_map_update->localities) {
707
1095
  const auto& locality = p.second;
708
1096
  gpr_log(GPR_INFO,
709
1097
  "[xds_client %p] Priority %" PRIuPTR ", locality %" PRIuPTR
710
- " %s contains %" PRIuPTR " server addresses",
711
- xds_client, priority, locality_count,
712
- locality.name->AsHumanReadableString(),
1098
+ " %s has weight %d, contains %" PRIuPTR " server addresses",
1099
+ xds_client(), priority, locality_count,
1100
+ locality.name->AsHumanReadableString(), locality.lb_weight,
713
1101
  locality.serverlist.size());
714
1102
  for (size_t i = 0; i < locality.serverlist.size(); ++i) {
715
- char* ipport;
716
- grpc_sockaddr_to_string(&ipport, &locality.serverlist[i].address(),
717
- false);
1103
+ std::string ipport = grpc_sockaddr_to_string(
1104
+ &locality.serverlist[i].address(), false);
718
1105
  gpr_log(GPR_INFO,
719
1106
  "[xds_client %p] Priority %" PRIuPTR ", locality %" PRIuPTR
720
1107
  " %s, server address %" PRIuPTR ": %s",
721
- xds_client, priority, locality_count,
722
- locality.name->AsHumanReadableString(), i, ipport);
723
- gpr_free(ipport);
1108
+ xds_client(), priority, locality_count,
1109
+ locality.name->AsHumanReadableString(), i, ipport.c_str());
724
1110
  }
725
1111
  ++locality_count;
726
1112
  }
727
1113
  }
728
- for (size_t i = 0; i < update.drop_config->drop_category_list().size();
729
- ++i) {
730
- const XdsDropConfig::DropCategory& drop_category =
731
- update.drop_config->drop_category_list()[i];
1114
+ for (size_t i = 0;
1115
+ i < eds_update.drop_config->drop_category_list().size(); ++i) {
1116
+ const XdsApi::DropConfig::DropCategory& drop_category =
1117
+ eds_update.drop_config->drop_category_list()[i];
732
1118
  gpr_log(GPR_INFO,
733
1119
  "[xds_client %p] Drop category %s has drop rate %d per million",
734
- xds_client, drop_category.name.get(),
1120
+ xds_client(), drop_category.name.c_str(),
735
1121
  drop_category.parts_per_million);
736
1122
  }
737
1123
  }
738
- // Start load reporting if needed.
739
- auto& lrs_call = ads_calld->chand()->lrs_calld_;
740
- if (lrs_call != nullptr) {
741
- LrsCallState* lrs_calld = lrs_call->calld();
742
- if (lrs_calld != nullptr) lrs_calld->MaybeStartReportingLocked();
743
- }
1124
+ EndpointState& endpoint_state =
1125
+ xds_client()->endpoint_map_[eds_service_name];
744
1126
  // Ignore identical update.
745
- const EdsUpdate& prev_update = xds_client->cluster_state_.eds_update;
746
- const bool priority_list_changed =
747
- prev_update.priority_list_update != update.priority_list_update;
748
- const bool drop_config_changed =
749
- prev_update.drop_config == nullptr ||
750
- *prev_update.drop_config != *update.drop_config;
751
- if (!priority_list_changed && !drop_config_changed) {
752
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
753
- gpr_log(GPR_INFO,
754
- "[xds_client %p] EDS update identical to current, ignoring.",
755
- xds_client);
1127
+ if (endpoint_state.update.has_value()) {
1128
+ const XdsApi::EdsUpdate& prev_update = endpoint_state.update.value();
1129
+ const bool priority_list_changed =
1130
+ prev_update.priority_list_update != eds_update.priority_list_update;
1131
+ const bool drop_config_changed =
1132
+ prev_update.drop_config == nullptr ||
1133
+ *prev_update.drop_config != *eds_update.drop_config;
1134
+ if (!priority_list_changed && !drop_config_changed) {
1135
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1136
+ gpr_log(GPR_INFO,
1137
+ "[xds_client %p] EDS update identical to current, ignoring.",
1138
+ xds_client());
1139
+ }
1140
+ continue;
756
1141
  }
757
- return;
758
1142
  }
759
1143
  // Update the cluster state.
760
- ClusterState& cluster_state = xds_client->cluster_state_;
761
- cluster_state.eds_update = std::move(update);
1144
+ endpoint_state.update = std::move(eds_update);
762
1145
  // Notify all watchers.
763
- for (const auto& p : cluster_state.endpoint_watchers) {
764
- p.first->OnEndpointChanged(cluster_state.eds_update);
1146
+ for (const auto& p : endpoint_state.watchers) {
1147
+ p.first->OnEndpointChanged(endpoint_state.update.value());
765
1148
  }
766
- }();
1149
+ }
1150
+ }
1151
+
1152
+ void XdsClient::ChannelState::AdsCallState::OnRequestSent(void* arg,
1153
+ grpc_error* error) {
1154
+ AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
1155
+ GRPC_ERROR_REF(error); // ref owned by lambda
1156
+ ads_calld->xds_client()->work_serializer_->Run(
1157
+ [ads_calld, error]() { ads_calld->OnRequestSentLocked(error); },
1158
+ DEBUG_LOCATION);
1159
+ }
1160
+
1161
+ void XdsClient::ChannelState::AdsCallState::OnRequestSentLocked(
1162
+ grpc_error* error) {
1163
+ if (IsCurrentCallOnChannel() && error == GRPC_ERROR_NONE) {
1164
+ // Clean up the sent message.
1165
+ grpc_byte_buffer_destroy(send_message_payload_);
1166
+ send_message_payload_ = nullptr;
1167
+ // Continue to send another pending message if any.
1168
+ // TODO(roth): The current code to handle buffered messages has the
1169
+ // advantage of sending only the most recent list of resource names for
1170
+ // each resource type (no matter how many times that resource type has
1171
+ // been requested to send while the current message sending is still
1172
+ // pending). But its disadvantage is that we send the requests in fixed
1173
+ // order of resource types. We need to fix this if we are seeing some
1174
+ // resource type(s) starved due to frequent requests of other resource
1175
+ // type(s).
1176
+ auto it = buffered_requests_.begin();
1177
+ if (it != buffered_requests_.end()) {
1178
+ SendMessageLocked(*it);
1179
+ buffered_requests_.erase(it);
1180
+ }
1181
+ }
1182
+ Unref(DEBUG_LOCATION, "ADS+OnRequestSentLocked");
1183
+ GRPC_ERROR_UNREF(error);
1184
+ }
1185
+
1186
+ void XdsClient::ChannelState::AdsCallState::OnResponseReceived(
1187
+ void* arg, grpc_error* /* error */) {
1188
+ AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
1189
+ ads_calld->xds_client()->work_serializer_->Run(
1190
+ [ads_calld]() { ads_calld->OnResponseReceivedLocked(); }, DEBUG_LOCATION);
1191
+ }
1192
+
1193
+ void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1194
+ // Empty payload means the call was cancelled.
1195
+ if (!IsCurrentCallOnChannel() || recv_message_payload_ == nullptr) {
1196
+ Unref(DEBUG_LOCATION, "ADS+OnResponseReceivedLocked");
1197
+ return;
1198
+ }
1199
+ // Read the response.
1200
+ grpc_byte_buffer_reader bbr;
1201
+ grpc_byte_buffer_reader_init(&bbr, recv_message_payload_);
1202
+ grpc_slice response_slice = grpc_byte_buffer_reader_readall(&bbr);
1203
+ grpc_byte_buffer_reader_destroy(&bbr);
1204
+ grpc_byte_buffer_destroy(recv_message_payload_);
1205
+ recv_message_payload_ = nullptr;
1206
+ // TODO(juanlishen): When we convert this to use the xds protocol, the
1207
+ // balancer will send us a fallback timeout such that we should go into
1208
+ // fallback mode if we have lost contact with the balancer after a certain
1209
+ // period of time. We will need to save the timeout value here, and then
1210
+ // when the balancer call ends, we will need to start a timer for the
1211
+ // specified period of time, and if the timer fires, we go into fallback
1212
+ // mode. We will also need to cancel the timer when we receive a serverlist
1213
+ // from the balancer.
1214
+ // Parse the response.
1215
+ absl::optional<XdsApi::LdsUpdate> lds_update;
1216
+ absl::optional<XdsApi::RdsUpdate> rds_update;
1217
+ XdsApi::CdsUpdateMap cds_update_map;
1218
+ XdsApi::EdsUpdateMap eds_update_map;
1219
+ std::string version;
1220
+ std::string nonce;
1221
+ std::string type_url;
1222
+ // Note that ParseAdsResponse() also validates the response.
1223
+ grpc_error* parse_error = xds_client()->api_.ParseAdsResponse(
1224
+ response_slice, xds_client()->server_name_,
1225
+ ResourceNamesForRequest(XdsApi::kRdsTypeUrl),
1226
+ ResourceNamesForRequest(XdsApi::kCdsTypeUrl),
1227
+ ResourceNamesForRequest(XdsApi::kEdsTypeUrl), &lds_update, &rds_update,
1228
+ &cds_update_map, &eds_update_map, &version, &nonce, &type_url);
767
1229
  grpc_slice_unref_internal(response_slice);
768
- if (xds_client->shutting_down_) {
769
- ads_calld->Unref(DEBUG_LOCATION,
770
- "ADS+OnResponseReceivedLocked+xds_shutdown");
1230
+ if (type_url.empty()) {
1231
+ // Ignore unparsable response.
1232
+ gpr_log(GPR_ERROR,
1233
+ "[xds_client %p] Error parsing ADS response (%s) -- ignoring",
1234
+ xds_client(), grpc_error_string(parse_error));
1235
+ GRPC_ERROR_UNREF(parse_error);
1236
+ } else {
1237
+ // Update nonce.
1238
+ auto& state = state_map_[type_url];
1239
+ state.nonce = std::move(nonce);
1240
+ // NACK or ACK the response.
1241
+ if (parse_error != GRPC_ERROR_NONE) {
1242
+ GRPC_ERROR_UNREF(state.error);
1243
+ state.error = parse_error;
1244
+ // NACK unacceptable update.
1245
+ gpr_log(GPR_ERROR,
1246
+ "[xds_client %p] ADS response invalid for resource type %s "
1247
+ "version %s, will NACK: nonce=%s error=%s",
1248
+ xds_client(), type_url.c_str(), version.c_str(),
1249
+ state.nonce.c_str(), grpc_error_string(parse_error));
1250
+ SendMessageLocked(type_url);
1251
+ } else {
1252
+ seen_response_ = true;
1253
+ // Accept the ADS response according to the type_url.
1254
+ if (type_url == XdsApi::kLdsTypeUrl) {
1255
+ AcceptLdsUpdate(std::move(lds_update));
1256
+ } else if (type_url == XdsApi::kRdsTypeUrl) {
1257
+ AcceptRdsUpdate(std::move(rds_update));
1258
+ } else if (type_url == XdsApi::kCdsTypeUrl) {
1259
+ AcceptCdsUpdate(std::move(cds_update_map));
1260
+ } else if (type_url == XdsApi::kEdsTypeUrl) {
1261
+ AcceptEdsUpdate(std::move(eds_update_map));
1262
+ }
1263
+ state.version = std::move(version);
1264
+ // ACK the update.
1265
+ SendMessageLocked(type_url);
1266
+ // Start load reporting if needed.
1267
+ auto& lrs_call = chand()->lrs_calld_;
1268
+ if (lrs_call != nullptr) {
1269
+ LrsCallState* lrs_calld = lrs_call->calld();
1270
+ if (lrs_calld != nullptr) lrs_calld->MaybeStartReportingLocked();
1271
+ }
1272
+ }
1273
+ }
1274
+ if (xds_client()->shutting_down_) {
1275
+ Unref(DEBUG_LOCATION, "ADS+OnResponseReceivedLocked+xds_shutdown");
771
1276
  return;
772
1277
  }
773
- // Keep listening for serverlist updates.
1278
+ // Keep listening for updates.
774
1279
  grpc_op op;
775
1280
  memset(&op, 0, sizeof(op));
776
1281
  op.op = GRPC_OP_RECV_MESSAGE;
777
- op.data.recv_message.recv_message = &ads_calld->recv_message_payload_;
1282
+ op.data.recv_message.recv_message = &recv_message_payload_;
778
1283
  op.flags = 0;
779
1284
  op.reserved = nullptr;
780
- GPR_ASSERT(ads_calld->call_ != nullptr);
1285
+ GPR_ASSERT(call_ != nullptr);
781
1286
  // Reuse the "ADS+OnResponseReceivedLocked" ref taken in ctor.
782
- GRPC_CLOSURE_INIT(&ads_calld->on_response_received_, OnResponseReceived,
783
- ads_calld, grpc_schedule_on_exec_ctx);
784
- const grpc_call_error call_error = grpc_call_start_batch_and_execute(
785
- ads_calld->call_, &op, 1, &ads_calld->on_response_received_);
1287
+ const grpc_call_error call_error =
1288
+ grpc_call_start_batch_and_execute(call_, &op, 1, &on_response_received_);
786
1289
  GPR_ASSERT(GRPC_CALL_OK == call_error);
787
1290
  }
788
1291
 
789
1292
  void XdsClient::ChannelState::AdsCallState::OnStatusReceived(
790
1293
  void* arg, grpc_error* error) {
791
1294
  AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
792
- ads_calld->xds_client()->combiner_->Run(
793
- GRPC_CLOSURE_INIT(&ads_calld->on_status_received_, OnStatusReceivedLocked,
794
- ads_calld, nullptr),
795
- GRPC_ERROR_REF(error));
1295
+ GRPC_ERROR_REF(error); // ref owned by lambda
1296
+ ads_calld->xds_client()->work_serializer_->Run(
1297
+ [ads_calld, error]() { ads_calld->OnStatusReceivedLocked(error); },
1298
+ DEBUG_LOCATION);
796
1299
  }
797
1300
 
798
1301
  void XdsClient::ChannelState::AdsCallState::OnStatusReceivedLocked(
799
- void* arg, grpc_error* error) {
800
- AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
801
- ChannelState* chand = ads_calld->chand();
802
- XdsClient* xds_client = ads_calld->xds_client();
1302
+ grpc_error* error) {
803
1303
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
804
- char* status_details = grpc_slice_to_c_string(ads_calld->status_details_);
1304
+ char* status_details = grpc_slice_to_c_string(status_details_);
805
1305
  gpr_log(GPR_INFO,
806
1306
  "[xds_client %p] ADS call status received. Status = %d, details "
807
1307
  "= '%s', (chand: %p, ads_calld: %p, call: %p), error '%s'",
808
- xds_client, ads_calld->status_code_, status_details, chand,
809
- ads_calld, ads_calld->call_, grpc_error_string(error));
1308
+ xds_client(), status_code_, status_details, chand(), this, call_,
1309
+ grpc_error_string(error));
810
1310
  gpr_free(status_details);
811
1311
  }
812
1312
  // Ignore status from a stale call.
813
- if (ads_calld->IsCurrentCallOnChannel()) {
1313
+ if (IsCurrentCallOnChannel()) {
814
1314
  // Try to restart the call.
815
- ads_calld->parent_->OnCallFinishedLocked();
1315
+ parent_->OnCallFinishedLocked();
816
1316
  // Send error to all watchers.
817
- xds_client->NotifyOnError(
1317
+ xds_client()->NotifyOnError(
818
1318
  GRPC_ERROR_CREATE_FROM_STATIC_STRING("xds call failed"));
819
1319
  }
820
- ads_calld->Unref(DEBUG_LOCATION, "ADS+OnStatusReceivedLocked");
1320
+ Unref(DEBUG_LOCATION, "ADS+OnStatusReceivedLocked");
1321
+ GRPC_ERROR_UNREF(error);
821
1322
  }
822
1323
 
823
1324
  bool XdsClient::ChannelState::AdsCallState::IsCurrentCallOnChannel() const {
@@ -827,6 +1328,21 @@ bool XdsClient::ChannelState::AdsCallState::IsCurrentCallOnChannel() const {
827
1328
  return this == chand()->ads_calld_->calld();
828
1329
  }
829
1330
 
1331
+ std::set<absl::string_view>
1332
+ XdsClient::ChannelState::AdsCallState::ResourceNamesForRequest(
1333
+ const std::string& type_url) {
1334
+ std::set<absl::string_view> resource_names;
1335
+ auto it = state_map_.find(type_url);
1336
+ if (it != state_map_.end()) {
1337
+ for (auto& p : it->second.subscribed_resources) {
1338
+ resource_names.insert(p.first);
1339
+ OrphanablePtr<ResourceState>& state = p.second;
1340
+ state->Start(Ref());
1341
+ }
1342
+ }
1343
+ return resource_names;
1344
+ }
1345
+
830
1346
  //
831
1347
  // XdsClient::ChannelState::LrsCallState::Reporter
832
1348
  //
@@ -840,8 +1356,6 @@ void XdsClient::ChannelState::LrsCallState::Reporter::Orphan() {
840
1356
  void XdsClient::ChannelState::LrsCallState::Reporter::
841
1357
  ScheduleNextReportLocked() {
842
1358
  const grpc_millis next_report_time = ExecCtx::Get()->Now() + report_interval_;
843
- GRPC_CLOSURE_INIT(&on_next_report_timer_, OnNextReportTimer, this,
844
- grpc_schedule_on_exec_ctx);
845
1359
  grpc_timer_init(&next_report_timer_, next_report_time,
846
1360
  &on_next_report_timer_);
847
1361
  next_report_timer_callback_pending_ = true;
@@ -850,43 +1364,56 @@ void XdsClient::ChannelState::LrsCallState::Reporter::
850
1364
  void XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimer(
851
1365
  void* arg, grpc_error* error) {
852
1366
  Reporter* self = static_cast<Reporter*>(arg);
853
- self->xds_client()->combiner_->Run(
854
- GRPC_CLOSURE_INIT(&self->on_next_report_timer_, OnNextReportTimerLocked,
855
- self, nullptr),
856
- GRPC_ERROR_REF(error));
1367
+ GRPC_ERROR_REF(error); // ref owned by lambda
1368
+ self->xds_client()->work_serializer_->Run(
1369
+ [self, error]() { self->OnNextReportTimerLocked(error); },
1370
+ DEBUG_LOCATION);
857
1371
  }
858
1372
 
859
1373
  void XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimerLocked(
860
- void* arg, grpc_error* error) {
861
- Reporter* self = static_cast<Reporter*>(arg);
862
- self->next_report_timer_callback_pending_ = false;
863
- if (error != GRPC_ERROR_NONE || !self->IsCurrentReporterOnCall()) {
864
- self->Unref(DEBUG_LOCATION, "Reporter+timer");
865
- return;
1374
+ grpc_error* error) {
1375
+ next_report_timer_callback_pending_ = false;
1376
+ if (error != GRPC_ERROR_NONE || !IsCurrentReporterOnCall()) {
1377
+ Unref(DEBUG_LOCATION, "Reporter+timer");
1378
+ } else {
1379
+ SendReportLocked();
1380
+ }
1381
+ GRPC_ERROR_UNREF(error);
1382
+ }
1383
+
1384
+ namespace {
1385
+
1386
+ bool LoadReportCountersAreZero(const XdsApi::ClusterLoadReportMap& snapshot) {
1387
+ for (const auto& p : snapshot) {
1388
+ const XdsApi::ClusterLoadReport& cluster_snapshot = p.second;
1389
+ for (const auto& q : cluster_snapshot.dropped_requests) {
1390
+ if (q.second > 0) return false;
1391
+ }
1392
+ for (const auto& q : cluster_snapshot.locality_stats) {
1393
+ const XdsClusterLocalityStats::Snapshot& locality_snapshot = q.second;
1394
+ if (!locality_snapshot.IsZero()) return false;
1395
+ }
866
1396
  }
867
- self->SendReportLocked();
1397
+ return true;
868
1398
  }
869
1399
 
1400
+ } // namespace
1401
+
870
1402
  void XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() {
871
- // Create a request that contains the load report.
872
- // TODO(roth): Currently, it is not possible to have multiple client
873
- // stats objects for a given cluster. However, in the future, we may
874
- // run into cases where this happens (e.g., due to graceful LB policy
875
- // switching). If/when this becomes a problem, replace this assertion
876
- // with code to merge data from multiple client stats objects.
877
- GPR_ASSERT(xds_client()->cluster_state_.client_stats.size() == 1);
878
- auto* client_stats = *xds_client()->cluster_state_.client_stats.begin();
879
- grpc_slice request_payload_slice =
880
- XdsLrsRequestCreateAndEncode(parent_->cluster_name_.get(), client_stats);
1403
+ // Construct snapshot from all reported stats.
1404
+ XdsApi::ClusterLoadReportMap snapshot = xds_client()->BuildLoadReportSnapshot(
1405
+ parent_->send_all_clusters_, parent_->cluster_names_);
881
1406
  // Skip client load report if the counters were all zero in the last
882
1407
  // report and they are still zero in this one.
883
1408
  const bool old_val = last_report_counters_were_zero_;
884
- last_report_counters_were_zero_ = static_cast<bool>(
885
- grpc_slice_eq(request_payload_slice, grpc_empty_slice()));
1409
+ last_report_counters_were_zero_ = LoadReportCountersAreZero(snapshot);
886
1410
  if (old_val && last_report_counters_were_zero_) {
887
1411
  ScheduleNextReportLocked();
888
1412
  return;
889
1413
  }
1414
+ // Create a request that contains the snapshot.
1415
+ grpc_slice request_payload_slice =
1416
+ xds_client()->api_.CreateLrsRequest(std::move(snapshot));
890
1417
  parent_->send_message_payload_ =
891
1418
  grpc_raw_byte_buffer_create(&request_payload_slice, 1);
892
1419
  grpc_slice_unref_internal(request_payload_slice);
@@ -895,8 +1422,6 @@ void XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() {
895
1422
  memset(&op, 0, sizeof(op));
896
1423
  op.op = GRPC_OP_SEND_MESSAGE;
897
1424
  op.data.send_message.send_message = parent_->send_message_payload_;
898
- GRPC_CLOSURE_INIT(&on_report_done_, OnReportDone, this,
899
- grpc_schedule_on_exec_ctx);
900
1425
  grpc_call_error call_error = grpc_call_start_batch_and_execute(
901
1426
  parent_->call_, &op, 1, &on_report_done_);
902
1427
  if (GPR_UNLIKELY(call_error != GRPC_CALL_OK)) {
@@ -910,27 +1435,32 @@ void XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() {
910
1435
  void XdsClient::ChannelState::LrsCallState::Reporter::OnReportDone(
911
1436
  void* arg, grpc_error* error) {
912
1437
  Reporter* self = static_cast<Reporter*>(arg);
913
- self->xds_client()->combiner_->Run(
914
- GRPC_CLOSURE_INIT(&self->on_report_done_, OnReportDoneLocked, self,
915
- nullptr),
916
- GRPC_ERROR_REF(error));
1438
+ GRPC_ERROR_REF(error); // ref owned by lambda
1439
+ self->xds_client()->work_serializer_->Run(
1440
+ [self, error]() { self->OnReportDoneLocked(error); }, DEBUG_LOCATION);
917
1441
  }
918
1442
 
919
1443
  void XdsClient::ChannelState::LrsCallState::Reporter::OnReportDoneLocked(
920
- void* arg, grpc_error* error) {
921
- Reporter* self = static_cast<Reporter*>(arg);
922
- grpc_byte_buffer_destroy(self->parent_->send_message_payload_);
923
- self->parent_->send_message_payload_ = nullptr;
924
- if (error != GRPC_ERROR_NONE || !self->IsCurrentReporterOnCall()) {
1444
+ grpc_error* error) {
1445
+ grpc_byte_buffer_destroy(parent_->send_message_payload_);
1446
+ parent_->send_message_payload_ = nullptr;
1447
+ // If there are no more registered stats to report, cancel the call.
1448
+ if (xds_client()->load_report_map_.empty()) {
1449
+ parent_->chand()->StopLrsCall();
1450
+ Unref(DEBUG_LOCATION, "Reporter+report_done+no_more_reporters");
1451
+ return;
1452
+ }
1453
+ if (error != GRPC_ERROR_NONE || !IsCurrentReporterOnCall()) {
925
1454
  // If this reporter is no longer the current one on the call, the reason
926
1455
  // might be that it was orphaned for a new one due to config update.
927
- if (!self->IsCurrentReporterOnCall()) {
928
- self->parent_->MaybeStartReportingLocked();
1456
+ if (!IsCurrentReporterOnCall()) {
1457
+ parent_->MaybeStartReportingLocked();
929
1458
  }
930
- self->Unref(DEBUG_LOCATION, "Reporter+report_done");
931
- return;
1459
+ Unref(DEBUG_LOCATION, "Reporter+report_done");
1460
+ } else {
1461
+ ScheduleNextReportLocked();
932
1462
  }
933
- self->ScheduleNextReportLocked();
1463
+ GRPC_ERROR_UNREF(error);
934
1464
  }
935
1465
 
936
1466
  //
@@ -945,8 +1475,7 @@ XdsClient::ChannelState::LrsCallState::LrsCallState(
945
1475
  // activity in xds_client()->interested_parties_, which is comprised of
946
1476
  // the polling entities from client_channel.
947
1477
  GPR_ASSERT(xds_client() != nullptr);
948
- GPR_ASSERT(xds_client()->server_name_ != nullptr);
949
- GPR_ASSERT(*xds_client()->server_name_.get() != '\0');
1478
+ GPR_ASSERT(!xds_client()->server_name_.empty());
950
1479
  call_ = grpc_channel_create_pollset_set_call(
951
1480
  chand()->channel_, nullptr, GRPC_PROPAGATE_DEFAULTS,
952
1481
  xds_client()->interested_parties_,
@@ -954,9 +1483,8 @@ XdsClient::ChannelState::LrsCallState::LrsCallState(
954
1483
  nullptr, GRPC_MILLIS_INF_FUTURE, nullptr);
955
1484
  GPR_ASSERT(call_ != nullptr);
956
1485
  // Init the request payload.
957
- grpc_slice request_payload_slice = XdsLrsRequestCreateAndEncode(
958
- xds_client()->server_name_.get(), xds_client()->bootstrap_->node(),
959
- xds_client()->build_version_.get());
1486
+ grpc_slice request_payload_slice =
1487
+ xds_client()->api_.CreateLrsInitialRequest(xds_client()->server_name_);
960
1488
  send_message_payload_ =
961
1489
  grpc_raw_byte_buffer_create(&request_payload_slice, 1);
962
1490
  grpc_slice_unref_internal(request_payload_slice);
@@ -978,7 +1506,8 @@ XdsClient::ChannelState::LrsCallState::LrsCallState(
978
1506
  grpc_op* op = ops;
979
1507
  op->op = GRPC_OP_SEND_INITIAL_METADATA;
980
1508
  op->data.send_initial_metadata.count = 0;
981
- op->flags = 0;
1509
+ op->flags = GRPC_INITIAL_METADATA_WAIT_FOR_READY |
1510
+ GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET;
982
1511
  op->reserved = nullptr;
983
1512
  op++;
984
1513
  // Op: send request message.
@@ -1066,81 +1595,82 @@ void XdsClient::ChannelState::LrsCallState::MaybeStartReportingLocked() {
1066
1595
  // Don't start if the ADS call hasn't received any valid response. Note that
1067
1596
  // this must be the first channel because it is the current channel but its
1068
1597
  // ADS call hasn't seen any response.
1069
- AdsCallState* ads_calld = chand()->ads_calld_->calld();
1070
- if (ads_calld == nullptr || !ads_calld->seen_response()) return;
1071
- // Start reporting.
1072
- for (auto* client_stats : chand()->xds_client_->cluster_state_.client_stats) {
1073
- client_stats->MaybeInitLastReportTime();
1598
+ if (chand()->ads_calld_ == nullptr ||
1599
+ chand()->ads_calld_->calld() == nullptr ||
1600
+ !chand()->ads_calld_->calld()->seen_response()) {
1601
+ return;
1074
1602
  }
1603
+ // Start reporting.
1075
1604
  reporter_ = MakeOrphanable<Reporter>(
1076
1605
  Ref(DEBUG_LOCATION, "LRS+load_report+start"), load_reporting_interval_);
1077
1606
  }
1078
1607
 
1079
1608
  void XdsClient::ChannelState::LrsCallState::OnInitialRequestSent(
1080
- void* arg, grpc_error* error) {
1609
+ void* arg, grpc_error* /*error*/) {
1081
1610
  LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
1082
- lrs_calld->xds_client()->combiner_->Run(
1083
- GRPC_CLOSURE_INIT(&lrs_calld->on_initial_request_sent_,
1084
- OnInitialRequestSentLocked, lrs_calld, nullptr),
1085
- GRPC_ERROR_REF(error));
1611
+ lrs_calld->xds_client()->work_serializer_->Run(
1612
+ [lrs_calld]() { lrs_calld->OnInitialRequestSentLocked(); },
1613
+ DEBUG_LOCATION);
1086
1614
  }
1087
1615
 
1088
- void XdsClient::ChannelState::LrsCallState::OnInitialRequestSentLocked(
1089
- void* arg, grpc_error* /*error*/) {
1090
- LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
1616
+ void XdsClient::ChannelState::LrsCallState::OnInitialRequestSentLocked() {
1091
1617
  // Clear the send_message_payload_.
1092
- grpc_byte_buffer_destroy(lrs_calld->send_message_payload_);
1093
- lrs_calld->send_message_payload_ = nullptr;
1094
- lrs_calld->MaybeStartReportingLocked();
1095
- lrs_calld->Unref(DEBUG_LOCATION, "LRS+OnInitialRequestSentLocked");
1618
+ grpc_byte_buffer_destroy(send_message_payload_);
1619
+ send_message_payload_ = nullptr;
1620
+ MaybeStartReportingLocked();
1621
+ Unref(DEBUG_LOCATION, "LRS+OnInitialRequestSentLocked");
1096
1622
  }
1097
1623
 
1098
1624
  void XdsClient::ChannelState::LrsCallState::OnResponseReceived(
1099
- void* arg, grpc_error* error) {
1625
+ void* arg, grpc_error* /*error*/) {
1100
1626
  LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
1101
- lrs_calld->xds_client()->combiner_->Run(
1102
- GRPC_CLOSURE_INIT(&lrs_calld->on_response_received_,
1103
- OnResponseReceivedLocked, lrs_calld, nullptr),
1104
- GRPC_ERROR_REF(error));
1627
+ lrs_calld->xds_client()->work_serializer_->Run(
1628
+ [lrs_calld]() { lrs_calld->OnResponseReceivedLocked(); }, DEBUG_LOCATION);
1105
1629
  }
1106
1630
 
1107
- void XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked(
1108
- void* arg, grpc_error* /*error*/) {
1109
- LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
1110
- XdsClient* xds_client = lrs_calld->xds_client();
1631
+ void XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() {
1111
1632
  // Empty payload means the call was cancelled.
1112
- if (!lrs_calld->IsCurrentCallOnChannel() ||
1113
- lrs_calld->recv_message_payload_ == nullptr) {
1114
- lrs_calld->Unref(DEBUG_LOCATION, "LRS+OnResponseReceivedLocked");
1633
+ if (!IsCurrentCallOnChannel() || recv_message_payload_ == nullptr) {
1634
+ Unref(DEBUG_LOCATION, "LRS+OnResponseReceivedLocked");
1115
1635
  return;
1116
1636
  }
1117
1637
  // Read the response.
1118
1638
  grpc_byte_buffer_reader bbr;
1119
- grpc_byte_buffer_reader_init(&bbr, lrs_calld->recv_message_payload_);
1639
+ grpc_byte_buffer_reader_init(&bbr, recv_message_payload_);
1120
1640
  grpc_slice response_slice = grpc_byte_buffer_reader_readall(&bbr);
1121
1641
  grpc_byte_buffer_reader_destroy(&bbr);
1122
- grpc_byte_buffer_destroy(lrs_calld->recv_message_payload_);
1123
- lrs_calld->recv_message_payload_ = nullptr;
1642
+ grpc_byte_buffer_destroy(recv_message_payload_);
1643
+ recv_message_payload_ = nullptr;
1124
1644
  // This anonymous lambda is a hack to avoid the usage of goto.
1125
1645
  [&]() {
1126
1646
  // Parse the response.
1127
- grpc_core::UniquePtr<char> new_cluster_name;
1647
+ bool send_all_clusters = false;
1648
+ std::set<std::string> new_cluster_names;
1128
1649
  grpc_millis new_load_reporting_interval;
1129
- grpc_error* parse_error = XdsLrsResponseDecodeAndParse(
1130
- response_slice, &new_cluster_name, &new_load_reporting_interval);
1650
+ grpc_error* parse_error = xds_client()->api_.ParseLrsResponse(
1651
+ response_slice, &send_all_clusters, &new_cluster_names,
1652
+ &new_load_reporting_interval);
1131
1653
  if (parse_error != GRPC_ERROR_NONE) {
1132
1654
  gpr_log(GPR_ERROR,
1133
1655
  "[xds_client %p] LRS response parsing failed. error=%s",
1134
- xds_client, grpc_error_string(parse_error));
1656
+ xds_client(), grpc_error_string(parse_error));
1135
1657
  GRPC_ERROR_UNREF(parse_error);
1136
1658
  return;
1137
1659
  }
1138
- lrs_calld->seen_response_ = true;
1660
+ seen_response_ = true;
1139
1661
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1140
- gpr_log(GPR_INFO,
1141
- "[xds_client %p] LRS response received, cluster_name=%s, "
1142
- "load_report_interval=%" PRId64 "ms",
1143
- xds_client, new_cluster_name.get(), new_load_reporting_interval);
1662
+ gpr_log(
1663
+ GPR_INFO,
1664
+ "[xds_client %p] LRS response received, %" PRIuPTR
1665
+ " cluster names, send_all_clusters=%d, load_report_interval=%" PRId64
1666
+ "ms",
1667
+ xds_client(), new_cluster_names.size(), send_all_clusters,
1668
+ new_load_reporting_interval);
1669
+ size_t i = 0;
1670
+ for (const auto& name : new_cluster_names) {
1671
+ gpr_log(GPR_INFO, "[xds_client %p] cluster_name %" PRIuPTR ": %s",
1672
+ xds_client(), i++, name.c_str());
1673
+ }
1144
1674
  }
1145
1675
  if (new_load_reporting_interval <
1146
1676
  GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS) {
@@ -1150,81 +1680,78 @@ void XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked(
1150
1680
  gpr_log(GPR_INFO,
1151
1681
  "[xds_client %p] Increased load_report_interval to minimum "
1152
1682
  "value %dms",
1153
- xds_client, GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS);
1683
+ xds_client(), GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS);
1154
1684
  }
1155
1685
  }
1156
1686
  // Ignore identical update.
1157
- if (lrs_calld->load_reporting_interval_ == new_load_reporting_interval &&
1158
- strcmp(lrs_calld->cluster_name_.get(), new_cluster_name.get()) == 0) {
1687
+ if (send_all_clusters == send_all_clusters_ &&
1688
+ cluster_names_ == new_cluster_names &&
1689
+ load_reporting_interval_ == new_load_reporting_interval) {
1159
1690
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1160
1691
  gpr_log(GPR_INFO,
1161
1692
  "[xds_client %p] Incoming LRS response identical to current, "
1162
1693
  "ignoring.",
1163
- xds_client);
1694
+ xds_client());
1164
1695
  }
1165
1696
  return;
1166
1697
  }
1167
1698
  // Stop current load reporting (if any) to adopt the new config.
1168
- lrs_calld->reporter_.reset();
1699
+ reporter_.reset();
1169
1700
  // Record the new config.
1170
- lrs_calld->cluster_name_ = std::move(new_cluster_name);
1171
- lrs_calld->load_reporting_interval_ = new_load_reporting_interval;
1701
+ send_all_clusters_ = send_all_clusters;
1702
+ cluster_names_ = std::move(new_cluster_names);
1703
+ load_reporting_interval_ = new_load_reporting_interval;
1172
1704
  // Try starting sending load report.
1173
- lrs_calld->MaybeStartReportingLocked();
1705
+ MaybeStartReportingLocked();
1174
1706
  }();
1175
1707
  grpc_slice_unref_internal(response_slice);
1176
- if (xds_client->shutting_down_) {
1177
- lrs_calld->Unref(DEBUG_LOCATION,
1178
- "LRS+OnResponseReceivedLocked+xds_shutdown");
1708
+ if (xds_client()->shutting_down_) {
1709
+ Unref(DEBUG_LOCATION, "LRS+OnResponseReceivedLocked+xds_shutdown");
1179
1710
  return;
1180
1711
  }
1181
1712
  // Keep listening for LRS config updates.
1182
1713
  grpc_op op;
1183
1714
  memset(&op, 0, sizeof(op));
1184
1715
  op.op = GRPC_OP_RECV_MESSAGE;
1185
- op.data.recv_message.recv_message = &lrs_calld->recv_message_payload_;
1716
+ op.data.recv_message.recv_message = &recv_message_payload_;
1186
1717
  op.flags = 0;
1187
1718
  op.reserved = nullptr;
1188
- GPR_ASSERT(lrs_calld->call_ != nullptr);
1719
+ GPR_ASSERT(call_ != nullptr);
1189
1720
  // Reuse the "OnResponseReceivedLocked" ref taken in ctor.
1190
- GRPC_CLOSURE_INIT(&lrs_calld->on_response_received_, OnResponseReceived,
1191
- lrs_calld, grpc_schedule_on_exec_ctx);
1192
- const grpc_call_error call_error = grpc_call_start_batch_and_execute(
1193
- lrs_calld->call_, &op, 1, &lrs_calld->on_response_received_);
1721
+ const grpc_call_error call_error =
1722
+ grpc_call_start_batch_and_execute(call_, &op, 1, &on_response_received_);
1194
1723
  GPR_ASSERT(GRPC_CALL_OK == call_error);
1195
1724
  }
1196
1725
 
1197
1726
  void XdsClient::ChannelState::LrsCallState::OnStatusReceived(
1198
1727
  void* arg, grpc_error* error) {
1199
1728
  LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
1200
- lrs_calld->xds_client()->combiner_->Run(
1201
- GRPC_CLOSURE_INIT(&lrs_calld->on_status_received_, OnStatusReceivedLocked,
1202
- lrs_calld, nullptr),
1203
- GRPC_ERROR_REF(error));
1729
+ GRPC_ERROR_REF(error); // ref owned by lambda
1730
+ lrs_calld->xds_client()->work_serializer_->Run(
1731
+ [lrs_calld, error]() { lrs_calld->OnStatusReceivedLocked(error); },
1732
+ DEBUG_LOCATION);
1204
1733
  }
1205
1734
 
1206
1735
  void XdsClient::ChannelState::LrsCallState::OnStatusReceivedLocked(
1207
- void* arg, grpc_error* error) {
1208
- LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
1209
- XdsClient* xds_client = lrs_calld->xds_client();
1210
- ChannelState* chand = lrs_calld->chand();
1211
- GPR_ASSERT(lrs_calld->call_ != nullptr);
1736
+ grpc_error* error) {
1737
+ GPR_ASSERT(call_ != nullptr);
1212
1738
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1213
- char* status_details = grpc_slice_to_c_string(lrs_calld->status_details_);
1739
+ char* status_details = grpc_slice_to_c_string(status_details_);
1214
1740
  gpr_log(GPR_INFO,
1215
1741
  "[xds_client %p] LRS call status received. Status = %d, details "
1216
1742
  "= '%s', (chand: %p, calld: %p, call: %p), error '%s'",
1217
- xds_client, lrs_calld->status_code_, status_details, chand,
1218
- lrs_calld, lrs_calld->call_, grpc_error_string(error));
1743
+ xds_client(), status_code_, status_details, chand(), this, call_,
1744
+ grpc_error_string(error));
1219
1745
  gpr_free(status_details);
1220
1746
  }
1221
1747
  // Ignore status from a stale call.
1222
- if (lrs_calld->IsCurrentCallOnChannel()) {
1223
- GPR_ASSERT(!xds_client->shutting_down_);
1748
+ if (IsCurrentCallOnChannel()) {
1749
+ GPR_ASSERT(!xds_client()->shutting_down_);
1224
1750
  // Try to restart the call.
1225
- lrs_calld->parent_->OnCallFinishedLocked();
1751
+ parent_->OnCallFinishedLocked();
1226
1752
  }
1227
- lrs_calld->Unref(DEBUG_LOCATION, "LRS+OnStatusReceivedLocked");
1753
+ Unref(DEBUG_LOCATION, "LRS+OnStatusReceivedLocked");
1754
+ GRPC_ERROR_UNREF(error);
1228
1755
  }
1229
1756
 
1230
1757
  bool XdsClient::ChannelState::LrsCallState::IsCurrentCallOnChannel() const {
@@ -1240,124 +1767,240 @@ bool XdsClient::ChannelState::LrsCallState::IsCurrentCallOnChannel() const {
1240
1767
 
1241
1768
  namespace {
1242
1769
 
1243
- grpc_core::UniquePtr<char> GenerateBuildVersionString() {
1244
- char* build_version_str;
1245
- gpr_asprintf(&build_version_str, "gRPC C-core %s %s", grpc_version_string(),
1246
- GPR_PLATFORM_STRING);
1247
- return grpc_core::UniquePtr<char>(build_version_str);
1770
+ grpc_millis GetRequestTimeout(const grpc_channel_args& args) {
1771
+ return grpc_channel_args_find_integer(
1772
+ &args, GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS,
1773
+ {15000, 0, INT_MAX});
1248
1774
  }
1249
1775
 
1250
1776
  } // namespace
1251
1777
 
1252
- XdsClient::XdsClient(Combiner* combiner, grpc_pollset_set* interested_parties,
1253
- StringView server_name,
1778
+ XdsClient::XdsClient(std::shared_ptr<WorkSerializer> work_serializer,
1779
+ grpc_pollset_set* interested_parties,
1780
+ absl::string_view server_name,
1254
1781
  std::unique_ptr<ServiceConfigWatcherInterface> watcher,
1255
1782
  const grpc_channel_args& channel_args, grpc_error** error)
1256
- : build_version_(GenerateBuildVersionString()),
1257
- combiner_(GRPC_COMBINER_REF(combiner, "xds_client")),
1783
+ : InternallyRefCounted<XdsClient>(&grpc_xds_client_trace),
1784
+ request_timeout_(GetRequestTimeout(channel_args)),
1785
+ work_serializer_(std::move(work_serializer)),
1258
1786
  interested_parties_(interested_parties),
1259
- bootstrap_(XdsBootstrap::ReadFromFile(error)),
1260
- server_name_(StringViewToCString(server_name)),
1787
+ bootstrap_(
1788
+ XdsBootstrap::ReadFromFile(this, &grpc_xds_client_trace, error)),
1789
+ api_(this, &grpc_xds_client_trace,
1790
+ bootstrap_ == nullptr ? nullptr : bootstrap_->node()),
1791
+ server_name_(server_name),
1261
1792
  service_config_watcher_(std::move(watcher)) {
1793
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1794
+ gpr_log(GPR_INFO, "[xds_client %p] creating xds client", this);
1795
+ }
1262
1796
  if (*error != GRPC_ERROR_NONE) {
1263
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1264
- gpr_log(GPR_INFO, "[xds_client %p: failed to read bootstrap file: %s",
1265
- this, grpc_error_string(*error));
1266
- }
1797
+ gpr_log(GPR_ERROR, "[xds_client %p] failed to read bootstrap file: %s",
1798
+ this, grpc_error_string(*error));
1267
1799
  return;
1268
1800
  }
1269
1801
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1270
- gpr_log(GPR_INFO, "[xds_client %p: creating channel to %s", this,
1271
- bootstrap_->server_uri());
1802
+ gpr_log(GPR_INFO, "[xds_client %p] creating channel to %s", this,
1803
+ bootstrap_->server().server_uri.c_str());
1804
+ }
1805
+ grpc_channel_args* new_args = BuildXdsChannelArgs(channel_args);
1806
+ grpc_channel* channel = CreateXdsChannel(*bootstrap_, *new_args, error);
1807
+ grpc_channel_args_destroy(new_args);
1808
+ if (*error != GRPC_ERROR_NONE) {
1809
+ gpr_log(GPR_ERROR, "[xds_client %p] failed to create xds channel: %s", this,
1810
+ grpc_error_string(*error));
1811
+ return;
1272
1812
  }
1273
1813
  chand_ = MakeOrphanable<ChannelState>(
1274
- Ref(DEBUG_LOCATION, "XdsClient+ChannelState"), channel_args);
1814
+ Ref(DEBUG_LOCATION, "XdsClient+ChannelState"), channel);
1275
1815
  if (service_config_watcher_ != nullptr) {
1276
- // TODO(juanlishen): Start LDS call and do not return service config
1277
- // until we get the first LDS response.
1278
- GRPC_CLOSURE_INIT(&service_config_notify_, NotifyOnServiceConfig,
1279
- Ref().release(), nullptr);
1280
- combiner_->Run(&service_config_notify_, GRPC_ERROR_NONE);
1816
+ chand_->Subscribe(XdsApi::kLdsTypeUrl, std::string(server_name));
1281
1817
  }
1282
1818
  }
1283
1819
 
1284
- XdsClient::~XdsClient() { GRPC_COMBINER_UNREF(combiner_, "xds_client"); }
1820
+ XdsClient::~XdsClient() {
1821
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1822
+ gpr_log(GPR_INFO, "[xds_client %p] destroying xds client", this);
1823
+ }
1824
+ }
1285
1825
 
1286
1826
  void XdsClient::Orphan() {
1827
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1828
+ gpr_log(GPR_INFO, "[xds_client %p] shutting down xds client", this);
1829
+ }
1287
1830
  shutting_down_ = true;
1288
1831
  chand_.reset();
1832
+ // We do not clear cluster_map_ and endpoint_map_ if the xds client was
1833
+ // created by the XdsResolver because the maps contain refs for watchers which
1834
+ // in turn hold refs to the loadbalancing policies. At this point, it is
1835
+ // possible for ADS calls to be in progress. Unreffing the loadbalancing
1836
+ // policies before those calls are done would lead to issues such as
1837
+ // https://github.com/grpc/grpc/issues/20928.
1838
+ if (service_config_watcher_ != nullptr) {
1839
+ cluster_map_.clear();
1840
+ endpoint_map_.clear();
1841
+ }
1289
1842
  Unref(DEBUG_LOCATION, "XdsClient::Orphan()");
1290
1843
  }
1291
1844
 
1292
1845
  void XdsClient::WatchClusterData(
1293
- StringView cluster, std::unique_ptr<ClusterWatcherInterface> watcher) {
1846
+ absl::string_view cluster_name,
1847
+ std::unique_ptr<ClusterWatcherInterface> watcher) {
1848
+ std::string cluster_name_str = std::string(cluster_name);
1849
+ ClusterState& cluster_state = cluster_map_[cluster_name_str];
1294
1850
  ClusterWatcherInterface* w = watcher.get();
1295
- cluster_state_.cluster_watchers[w] = std::move(watcher);
1296
- // TODO(juanlishen): Start CDS call if not already started and return
1297
- // real data via watcher.
1298
- CdsUpdate update;
1299
- update.eds_service_name = StringViewToCString(cluster);
1300
- update.lrs_load_reporting_server_name.reset(gpr_strdup(""));
1301
- w->OnClusterChanged(std::move(update));
1851
+ cluster_state.watchers[w] = std::move(watcher);
1852
+ // If we've already received an CDS update, notify the new watcher
1853
+ // immediately.
1854
+ if (cluster_state.update.has_value()) {
1855
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1856
+ gpr_log(GPR_INFO, "[xds_client %p] returning cached cluster data for %s",
1857
+ this, cluster_name_str.c_str());
1858
+ }
1859
+ w->OnClusterChanged(cluster_state.update.value());
1860
+ }
1861
+ chand_->Subscribe(XdsApi::kCdsTypeUrl, cluster_name_str);
1302
1862
  }
1303
1863
 
1304
- void XdsClient::CancelClusterDataWatch(StringView cluster,
1305
- ClusterWatcherInterface* watcher) {
1306
- auto it = cluster_state_.cluster_watchers.find(watcher);
1307
- if (it != cluster_state_.cluster_watchers.end()) {
1308
- cluster_state_.cluster_watchers.erase(it);
1309
- }
1310
- if (chand_ != nullptr && cluster_state_.cluster_watchers.empty()) {
1311
- // TODO(juanlishen): Stop CDS call.
1864
+ void XdsClient::CancelClusterDataWatch(absl::string_view cluster_name,
1865
+ ClusterWatcherInterface* watcher,
1866
+ bool delay_unsubscription) {
1867
+ if (shutting_down_) return;
1868
+ std::string cluster_name_str = std::string(cluster_name);
1869
+ ClusterState& cluster_state = cluster_map_[cluster_name_str];
1870
+ auto it = cluster_state.watchers.find(watcher);
1871
+ if (it != cluster_state.watchers.end()) {
1872
+ cluster_state.watchers.erase(it);
1873
+ if (cluster_state.watchers.empty()) {
1874
+ cluster_map_.erase(cluster_name_str);
1875
+ chand_->Unsubscribe(XdsApi::kCdsTypeUrl, cluster_name_str,
1876
+ delay_unsubscription);
1877
+ }
1312
1878
  }
1313
1879
  }
1314
1880
 
1315
1881
  void XdsClient::WatchEndpointData(
1316
- StringView /*cluster*/, std::unique_ptr<EndpointWatcherInterface> watcher) {
1882
+ absl::string_view eds_service_name,
1883
+ std::unique_ptr<EndpointWatcherInterface> watcher) {
1884
+ std::string eds_service_name_str = std::string(eds_service_name);
1885
+ EndpointState& endpoint_state = endpoint_map_[eds_service_name_str];
1317
1886
  EndpointWatcherInterface* w = watcher.get();
1318
- cluster_state_.endpoint_watchers[w] = std::move(watcher);
1887
+ endpoint_state.watchers[w] = std::move(watcher);
1319
1888
  // If we've already received an EDS update, notify the new watcher
1320
1889
  // immediately.
1321
- if (!cluster_state_.eds_update.priority_list_update.empty()) {
1322
- w->OnEndpointChanged(cluster_state_.eds_update);
1890
+ if (endpoint_state.update.has_value()) {
1891
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1892
+ gpr_log(GPR_INFO, "[xds_client %p] returning cached endpoint data for %s",
1893
+ this, eds_service_name_str.c_str());
1894
+ }
1895
+ w->OnEndpointChanged(endpoint_state.update.value());
1323
1896
  }
1324
- chand_->MaybeStartAdsCall();
1897
+ chand_->Subscribe(XdsApi::kEdsTypeUrl, eds_service_name_str);
1325
1898
  }
1326
1899
 
1327
- void XdsClient::CancelEndpointDataWatch(StringView /*cluster*/,
1328
- EndpointWatcherInterface* watcher) {
1329
- auto it = cluster_state_.endpoint_watchers.find(watcher);
1330
- if (it != cluster_state_.endpoint_watchers.end()) {
1331
- cluster_state_.endpoint_watchers.erase(it);
1332
- }
1333
- if (chand_ != nullptr && cluster_state_.endpoint_watchers.empty()) {
1334
- chand_->StopAdsCall();
1900
+ void XdsClient::CancelEndpointDataWatch(absl::string_view eds_service_name,
1901
+ EndpointWatcherInterface* watcher,
1902
+ bool delay_unsubscription) {
1903
+ if (shutting_down_) return;
1904
+ std::string eds_service_name_str = std::string(eds_service_name);
1905
+ EndpointState& endpoint_state = endpoint_map_[eds_service_name_str];
1906
+ auto it = endpoint_state.watchers.find(watcher);
1907
+ if (it != endpoint_state.watchers.end()) {
1908
+ endpoint_state.watchers.erase(it);
1909
+ if (endpoint_state.watchers.empty()) {
1910
+ endpoint_map_.erase(eds_service_name_str);
1911
+ chand_->Unsubscribe(XdsApi::kEdsTypeUrl, eds_service_name_str,
1912
+ delay_unsubscription);
1913
+ }
1335
1914
  }
1336
1915
  }
1337
1916
 
1338
- void XdsClient::AddClientStats(StringView /*lrs_server*/,
1339
- StringView /*cluster*/,
1340
- XdsClientStats* client_stats) {
1917
+ RefCountedPtr<XdsClusterDropStats> XdsClient::AddClusterDropStats(
1918
+ absl::string_view lrs_server, absl::string_view cluster_name,
1919
+ absl::string_view eds_service_name) {
1341
1920
  // TODO(roth): When we add support for direct federation, use the
1342
1921
  // server name specified in lrs_server.
1343
- cluster_state_.client_stats.insert(client_stats);
1922
+ auto key =
1923
+ std::make_pair(std::string(cluster_name), std::string(eds_service_name));
1924
+ // We jump through some hoops here to make sure that the absl::string_views
1925
+ // stored in the XdsClusterDropStats object point to the strings
1926
+ // in the load_report_map_ key, so that they have the same lifetime.
1927
+ auto it = load_report_map_
1928
+ .emplace(std::make_pair(std::move(key), LoadReportState()))
1929
+ .first;
1930
+ auto cluster_drop_stats = MakeRefCounted<XdsClusterDropStats>(
1931
+ Ref(DEBUG_LOCATION, "DropStats"), lrs_server,
1932
+ it->first.first /*cluster_name*/, it->first.second /*eds_service_name*/);
1933
+ it->second.drop_stats.insert(cluster_drop_stats.get());
1344
1934
  chand_->MaybeStartLrsCall();
1935
+ return cluster_drop_stats;
1345
1936
  }
1346
1937
 
1347
- void XdsClient::RemoveClientStats(StringView /*lrs_server*/,
1348
- StringView /*cluster*/,
1349
- XdsClientStats* client_stats) {
1938
+ void XdsClient::RemoveClusterDropStats(
1939
+ absl::string_view /*lrs_server*/, absl::string_view cluster_name,
1940
+ absl::string_view eds_service_name,
1941
+ XdsClusterDropStats* cluster_drop_stats) {
1942
+ auto load_report_it = load_report_map_.find(
1943
+ std::make_pair(std::string(cluster_name), std::string(eds_service_name)));
1944
+ if (load_report_it == load_report_map_.end()) return;
1945
+ LoadReportState& load_report_state = load_report_it->second;
1350
1946
  // TODO(roth): When we add support for direct federation, use the
1351
1947
  // server name specified in lrs_server.
1352
- // TODO(roth): In principle, we should try to send a final load report
1353
- // containing whatever final stats have been accumulated since the
1354
- // last load report.
1355
- auto it = cluster_state_.client_stats.find(client_stats);
1356
- if (it != cluster_state_.client_stats.end()) {
1357
- cluster_state_.client_stats.erase(it);
1948
+ auto it = load_report_state.drop_stats.find(cluster_drop_stats);
1949
+ if (it != load_report_state.drop_stats.end()) {
1950
+ // Record final drop stats in deleted_drop_stats, which will be
1951
+ // added to the next load report.
1952
+ for (const auto& p : cluster_drop_stats->GetSnapshotAndReset()) {
1953
+ load_report_state.deleted_drop_stats[p.first] += p.second;
1954
+ }
1955
+ load_report_state.drop_stats.erase(it);
1358
1956
  }
1359
- if (chand_ != nullptr && cluster_state_.client_stats.empty()) {
1360
- chand_->StopLrsCall();
1957
+ }
1958
+
1959
+ RefCountedPtr<XdsClusterLocalityStats> XdsClient::AddClusterLocalityStats(
1960
+ absl::string_view lrs_server, absl::string_view cluster_name,
1961
+ absl::string_view eds_service_name,
1962
+ RefCountedPtr<XdsLocalityName> locality) {
1963
+ // TODO(roth): When we add support for direct federation, use the
1964
+ // server name specified in lrs_server.
1965
+ auto key =
1966
+ std::make_pair(std::string(cluster_name), std::string(eds_service_name));
1967
+ // We jump through some hoops here to make sure that the absl::string_views
1968
+ // stored in the XdsClusterLocalityStats object point to the strings
1969
+ // in the load_report_map_ key, so that they have the same lifetime.
1970
+ auto it = load_report_map_
1971
+ .emplace(std::make_pair(std::move(key), LoadReportState()))
1972
+ .first;
1973
+ auto cluster_locality_stats = MakeRefCounted<XdsClusterLocalityStats>(
1974
+ Ref(DEBUG_LOCATION, "LocalityStats"), lrs_server,
1975
+ it->first.first /*cluster_name*/, it->first.second /*eds_service_name*/,
1976
+ locality);
1977
+ it->second.locality_stats[std::move(locality)].locality_stats.insert(
1978
+ cluster_locality_stats.get());
1979
+ chand_->MaybeStartLrsCall();
1980
+ return cluster_locality_stats;
1981
+ }
1982
+
1983
+ void XdsClient::RemoveClusterLocalityStats(
1984
+ absl::string_view /*lrs_server*/, absl::string_view cluster_name,
1985
+ absl::string_view eds_service_name,
1986
+ const RefCountedPtr<XdsLocalityName>& locality,
1987
+ XdsClusterLocalityStats* cluster_locality_stats) {
1988
+ auto load_report_it = load_report_map_.find(
1989
+ std::make_pair(std::string(cluster_name), std::string(eds_service_name)));
1990
+ if (load_report_it == load_report_map_.end()) return;
1991
+ LoadReportState& load_report_state = load_report_it->second;
1992
+ // TODO(roth): When we add support for direct federation, use the
1993
+ // server name specified in lrs_server.
1994
+ auto locality_it = load_report_state.locality_stats.find(locality);
1995
+ if (locality_it == load_report_state.locality_stats.end()) return;
1996
+ auto& locality_set = locality_it->second.locality_stats;
1997
+ auto it = locality_set.find(cluster_locality_stats);
1998
+ if (it != locality_set.end()) {
1999
+ // Record final snapshot in deleted_locality_stats, which will be
2000
+ // added to the next load report.
2001
+ locality_it->second.deleted_locality_stats.emplace_back(
2002
+ cluster_locality_stats->GetSnapshotAndReset());
2003
+ locality_set.erase(it);
1361
2004
  }
1362
2005
  }
1363
2006
 
@@ -1367,54 +2010,332 @@ void XdsClient::ResetBackoff() {
1367
2010
  }
1368
2011
  }
1369
2012
 
2013
+ namespace {
2014
+ std::string CreateServiceConfigActionCluster(const std::string& cluster_name) {
2015
+ return absl::StrFormat(
2016
+ " \"cds:%s\":{\n"
2017
+ " \"childPolicy\":[ {\n"
2018
+ " \"cds_experimental\":{\n"
2019
+ " \"cluster\": \"%s\"\n"
2020
+ " }\n"
2021
+ " } ]\n"
2022
+ " }",
2023
+ cluster_name, cluster_name);
2024
+ }
2025
+
2026
+ std::string CreateServiceConfigRoute(const std::string& action_name,
2027
+ const std::string& service,
2028
+ const std::string& method) {
2029
+ return absl::StrFormat(
2030
+ " { \n"
2031
+ " \"methodName\": {\n"
2032
+ " \"service\": \"%s\",\n"
2033
+ " \"method\": \"%s\"\n"
2034
+ " },\n"
2035
+ " \"action\": \"%s\"\n"
2036
+ " }",
2037
+ service, method, action_name);
2038
+ }
2039
+
2040
+ // Create the service config for one weighted cluster.
2041
+ std::string CreateServiceConfigActionWeightedCluster(
2042
+ const std::string& name,
2043
+ const std::vector<XdsApi::RdsUpdate::RdsRoute::ClusterWeight>& clusters) {
2044
+ std::vector<std::string> config_parts;
2045
+ config_parts.push_back(
2046
+ absl::StrFormat(" \"weighted:%s\":{\n"
2047
+ " \"childPolicy\":[ {\n"
2048
+ " \"weighted_target_experimental\":{\n"
2049
+ " \"targets\":{\n",
2050
+ name));
2051
+ std::vector<std::string> weighted_targets;
2052
+ weighted_targets.reserve(clusters.size());
2053
+ for (const auto& cluster_weight : clusters) {
2054
+ weighted_targets.push_back(absl::StrFormat(
2055
+ " \"%s\":{\n"
2056
+ " \"weight\":%d,\n"
2057
+ " \"childPolicy\":[ {\n"
2058
+ " \"cds_experimental\":{\n"
2059
+ " \"cluster\": \"%s\"\n"
2060
+ " }\n"
2061
+ " } ]\n"
2062
+ " }",
2063
+ cluster_weight.name, cluster_weight.weight, cluster_weight.name));
2064
+ }
2065
+ config_parts.push_back(absl::StrJoin(weighted_targets, ",\n"));
2066
+ config_parts.push_back(
2067
+ " }\n"
2068
+ " }\n"
2069
+ " } ]\n"
2070
+ " }");
2071
+ return absl::StrJoin(config_parts, "");
2072
+ }
2073
+
2074
+ struct WeightedClustersKeys {
2075
+ std::string cluster_names_key;
2076
+ std::string cluster_weights_key;
2077
+ };
2078
+
2079
+ // Returns the cluster names and weights key or the cluster names only key.
2080
+ WeightedClustersKeys GetWeightedClustersKey(
2081
+ const std::vector<XdsApi::RdsUpdate::RdsRoute::ClusterWeight>&
2082
+ weighted_clusters) {
2083
+ std::set<std::string> cluster_names;
2084
+ std::set<std::string> cluster_weights;
2085
+ for (const auto& cluster_weight : weighted_clusters) {
2086
+ cluster_names.emplace(absl::StrFormat("%s", cluster_weight.name));
2087
+ cluster_weights.emplace(
2088
+ absl::StrFormat("%s_%d", cluster_weight.name, cluster_weight.weight));
2089
+ }
2090
+ return {absl::StrJoin(cluster_names, "_"),
2091
+ absl::StrJoin(cluster_weights, "_")};
2092
+ }
2093
+
2094
+ } // namespace
2095
+
2096
+ std::string XdsClient::WeightedClustersActionName(
2097
+ const std::vector<XdsApi::RdsUpdate::RdsRoute::ClusterWeight>&
2098
+ weighted_clusters) {
2099
+ WeightedClustersKeys keys = GetWeightedClustersKey(weighted_clusters);
2100
+ auto cluster_names_map_it =
2101
+ weighted_cluster_index_map_.find(keys.cluster_names_key);
2102
+ GPR_ASSERT(cluster_names_map_it != weighted_cluster_index_map_.end());
2103
+ const auto& cluster_weights_map =
2104
+ cluster_names_map_it->second.cluster_weights_map;
2105
+ auto cluster_weights_map_it =
2106
+ cluster_weights_map.find(keys.cluster_weights_key);
2107
+ GPR_ASSERT(cluster_weights_map_it != cluster_weights_map.end());
2108
+ return absl::StrFormat("%s_%d", keys.cluster_names_key,
2109
+ cluster_weights_map_it->second);
2110
+ }
2111
+
2112
+ void XdsClient::UpdateWeightedClusterIndexMap(
2113
+ const XdsApi::RdsUpdate& rds_update) {
2114
+ // Construct a list of unique WeightedCluster
2115
+ // actions which we need to process: to find action names
2116
+ std::map<std::string /* cluster_weights_key */,
2117
+ std::string /* cluster_names_key */>
2118
+ actions_to_process;
2119
+ for (const auto& route : rds_update.routes) {
2120
+ if (!route.weighted_clusters.empty()) {
2121
+ WeightedClustersKeys keys =
2122
+ GetWeightedClustersKey(route.weighted_clusters);
2123
+ auto action_it = actions_to_process.find(keys.cluster_weights_key);
2124
+ if (action_it == actions_to_process.end()) {
2125
+ actions_to_process[std::move(keys.cluster_weights_key)] =
2126
+ std::move(keys.cluster_names_key);
2127
+ }
2128
+ }
2129
+ }
2130
+ // First pass of all unique WeightedCluster actions: if the exact same
2131
+ // weighted target policy (same clusters and weights) appears in the old map,
2132
+ // then that old action name is taken again and should be moved to the new
2133
+ // map; any other action names from the old set of actions are candidates for
2134
+ // reuse.
2135
+ XdsClient::WeightedClusterIndexMap new_weighted_cluster_index_map;
2136
+ for (auto action_it = actions_to_process.begin();
2137
+ action_it != actions_to_process.end();) {
2138
+ const std::string& cluster_names_key = action_it->second;
2139
+ const std::string& cluster_weights_key = action_it->first;
2140
+ auto old_cluster_names_map_it =
2141
+ weighted_cluster_index_map_.find(cluster_names_key);
2142
+ if (old_cluster_names_map_it != weighted_cluster_index_map_.end()) {
2143
+ // Add cluster_names_key to the new map and copy next_index.
2144
+ auto& new_cluster_names_info =
2145
+ new_weighted_cluster_index_map[cluster_names_key];
2146
+ new_cluster_names_info.next_index =
2147
+ old_cluster_names_map_it->second.next_index;
2148
+ // Lookup cluster_weights_key in old map.
2149
+ auto& old_cluster_weights_map =
2150
+ old_cluster_names_map_it->second.cluster_weights_map;
2151
+ auto old_cluster_weights_map_it =
2152
+ old_cluster_weights_map.find(cluster_weights_key);
2153
+ if (old_cluster_weights_map_it != old_cluster_weights_map.end()) {
2154
+ // same policy found, move from old map to new map.
2155
+ new_cluster_names_info.cluster_weights_map[cluster_weights_key] =
2156
+ old_cluster_weights_map_it->second;
2157
+ old_cluster_weights_map.erase(old_cluster_weights_map_it);
2158
+ // This action has been added to new map, so no need to process it
2159
+ // again.
2160
+ action_it = actions_to_process.erase(action_it);
2161
+ continue;
2162
+ }
2163
+ }
2164
+ ++action_it;
2165
+ }
2166
+ // Second pass of all remaining unique WeightedCluster actions: if clusters
2167
+ // for a new action are the same as an old unused action, reuse the name. If
2168
+ // clusters differ, use a brand new name.
2169
+ for (const auto& action : actions_to_process) {
2170
+ const std::string& cluster_names_key = action.second;
2171
+ const std::string& cluster_weights_key = action.first;
2172
+ auto& new_cluster_names_info =
2173
+ new_weighted_cluster_index_map[cluster_names_key];
2174
+ auto& old_cluster_weights_map =
2175
+ weighted_cluster_index_map_[cluster_names_key].cluster_weights_map;
2176
+ auto old_cluster_weights_it = old_cluster_weights_map.begin();
2177
+ if (old_cluster_weights_it != old_cluster_weights_map.end()) {
2178
+ // There is something to reuse: this action uses the same set
2179
+ // of clusters as a previous action and that action name is not
2180
+ // already taken.
2181
+ new_cluster_names_info.cluster_weights_map[cluster_weights_key] =
2182
+ old_cluster_weights_it->second;
2183
+ // Remove the name from being able to reuse again.
2184
+ old_cluster_weights_map.erase(old_cluster_weights_it);
2185
+ } else {
2186
+ // There is nothing to reuse, take the next index to use and
2187
+ // increment.
2188
+ new_cluster_names_info.cluster_weights_map[cluster_weights_key] =
2189
+ new_cluster_names_info.next_index++;
2190
+ }
2191
+ }
2192
+ weighted_cluster_index_map_ = std::move(new_weighted_cluster_index_map);
2193
+ }
2194
+
2195
+ grpc_error* XdsClient::CreateServiceConfig(
2196
+ const XdsApi::RdsUpdate& rds_update,
2197
+ RefCountedPtr<ServiceConfig>* service_config) {
2198
+ UpdateWeightedClusterIndexMap(rds_update);
2199
+ std::vector<std::string> actions_vector;
2200
+ std::vector<std::string> route_table;
2201
+ std::set<std::string> actions_set;
2202
+ for (const auto& route : rds_update.routes) {
2203
+ const std::string action_name =
2204
+ route.weighted_clusters.empty()
2205
+ ? route.cluster_name
2206
+ : WeightedClustersActionName(route.weighted_clusters);
2207
+ if (actions_set.find(action_name) == actions_set.end()) {
2208
+ actions_set.emplace(action_name);
2209
+ actions_vector.push_back(
2210
+ route.weighted_clusters.empty()
2211
+ ? CreateServiceConfigActionCluster(action_name)
2212
+ : CreateServiceConfigActionWeightedCluster(
2213
+ action_name, route.weighted_clusters));
2214
+ }
2215
+ route_table.push_back(CreateServiceConfigRoute(
2216
+ absl::StrFormat("%s:%s",
2217
+ route.weighted_clusters.empty() ? "cds" : "weighted",
2218
+ action_name),
2219
+ route.service, route.method));
2220
+ }
2221
+ std::vector<std::string> config_parts;
2222
+ config_parts.push_back(
2223
+ "{\n"
2224
+ " \"loadBalancingConfig\":[\n"
2225
+ " { \"xds_routing_experimental\":{\n"
2226
+ " \"actions\":{\n");
2227
+ config_parts.push_back(absl::StrJoin(actions_vector, ",\n"));
2228
+ config_parts.push_back(
2229
+ " },\n"
2230
+ " \"routes\":[\n");
2231
+ config_parts.push_back(absl::StrJoin(route_table, ",\n"));
2232
+ config_parts.push_back(
2233
+ " ]\n"
2234
+ " } }\n"
2235
+ " ]\n"
2236
+ "}");
2237
+ std::string json = absl::StrJoin(config_parts, "");
2238
+ grpc_error* error = GRPC_ERROR_NONE;
2239
+ *service_config = ServiceConfig::Create(json.c_str(), &error);
2240
+ return error;
2241
+ }
2242
+
2243
+ XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshot(
2244
+ bool send_all_clusters, const std::set<std::string>& clusters) {
2245
+ XdsApi::ClusterLoadReportMap snapshot_map;
2246
+ for (auto load_report_it = load_report_map_.begin();
2247
+ load_report_it != load_report_map_.end();) {
2248
+ // Cluster key is cluster and EDS service name.
2249
+ const auto& cluster_key = load_report_it->first;
2250
+ LoadReportState& load_report = load_report_it->second;
2251
+ // If the CDS response for a cluster indicates to use LRS but the
2252
+ // LRS server does not say that it wants reports for this cluster,
2253
+ // then we'll have stats objects here whose data we're not going to
2254
+ // include in the load report. However, we still need to clear out
2255
+ // the data from the stats objects, so that if the LRS server starts
2256
+ // asking for the data in the future, we don't incorrectly include
2257
+ // data from previous reporting intervals in that future report.
2258
+ const bool record_stats =
2259
+ send_all_clusters || clusters.find(cluster_key.first) != clusters.end();
2260
+ XdsApi::ClusterLoadReport snapshot;
2261
+ // Aggregate drop stats.
2262
+ snapshot.dropped_requests = std::move(load_report.deleted_drop_stats);
2263
+ for (auto& drop_stats : load_report.drop_stats) {
2264
+ for (const auto& p : drop_stats->GetSnapshotAndReset()) {
2265
+ snapshot.dropped_requests[p.first] += p.second;
2266
+ }
2267
+ }
2268
+ // Aggregate locality stats.
2269
+ for (auto it = load_report.locality_stats.begin();
2270
+ it != load_report.locality_stats.end();) {
2271
+ const RefCountedPtr<XdsLocalityName>& locality_name = it->first;
2272
+ auto& locality_state = it->second;
2273
+ XdsClusterLocalityStats::Snapshot& locality_snapshot =
2274
+ snapshot.locality_stats[locality_name];
2275
+ for (auto& locality_stats : locality_state.locality_stats) {
2276
+ locality_snapshot += locality_stats->GetSnapshotAndReset();
2277
+ }
2278
+ // Add final snapshots from recently deleted locality stats objects.
2279
+ for (auto& deleted_locality_stats :
2280
+ locality_state.deleted_locality_stats) {
2281
+ locality_snapshot += deleted_locality_stats;
2282
+ }
2283
+ locality_state.deleted_locality_stats.clear();
2284
+ // If the only thing left in this entry was final snapshots from
2285
+ // deleted locality stats objects, remove the entry.
2286
+ if (locality_state.locality_stats.empty()) {
2287
+ it = load_report.locality_stats.erase(it);
2288
+ } else {
2289
+ ++it;
2290
+ }
2291
+ }
2292
+ if (record_stats) {
2293
+ // Compute load report interval.
2294
+ const grpc_millis now = ExecCtx::Get()->Now();
2295
+ snapshot.load_report_interval = now - load_report.last_report_time;
2296
+ load_report.last_report_time = now;
2297
+ // Record snapshot.
2298
+ snapshot_map[cluster_key] = std::move(snapshot);
2299
+ }
2300
+ // If the only thing left in this entry was final snapshots from
2301
+ // deleted stats objects, remove the entry.
2302
+ if (load_report.locality_stats.empty() && load_report.drop_stats.empty()) {
2303
+ load_report_it = load_report_map_.erase(load_report_it);
2304
+ } else {
2305
+ ++load_report_it;
2306
+ }
2307
+ }
2308
+ return snapshot_map;
2309
+ }
2310
+
1370
2311
  void XdsClient::NotifyOnError(grpc_error* error) {
1371
2312
  if (service_config_watcher_ != nullptr) {
1372
2313
  service_config_watcher_->OnError(GRPC_ERROR_REF(error));
1373
2314
  }
1374
- for (const auto& p : cluster_state_.cluster_watchers) {
1375
- p.first->OnError(GRPC_ERROR_REF(error));
2315
+ for (const auto& p : cluster_map_) {
2316
+ const ClusterState& cluster_state = p.second;
2317
+ for (const auto& p : cluster_state.watchers) {
2318
+ p.first->OnError(GRPC_ERROR_REF(error));
2319
+ }
1376
2320
  }
1377
- for (const auto& p : cluster_state_.endpoint_watchers) {
1378
- p.first->OnError(GRPC_ERROR_REF(error));
2321
+ for (const auto& p : endpoint_map_) {
2322
+ const EndpointState& endpoint_state = p.second;
2323
+ for (const auto& p : endpoint_state.watchers) {
2324
+ p.first->OnError(GRPC_ERROR_REF(error));
2325
+ }
1379
2326
  }
1380
2327
  GRPC_ERROR_UNREF(error);
1381
2328
  }
1382
2329
 
1383
- void XdsClient::NotifyOnServiceConfig(void* arg, grpc_error* error) {
1384
- XdsClient* self = static_cast<XdsClient*>(arg);
1385
- // TODO(roth): When we add support for WeightedClusters, select the
1386
- // LB policy based on that functionality.
1387
- char* json;
1388
- gpr_asprintf(&json,
1389
- "{\n"
1390
- " \"loadBalancingConfig\":[\n"
1391
- " { \"cds_experimental\":{\n"
1392
- " \"cluster\": \"%s\"\n"
1393
- " } }\n"
1394
- " ]\n"
1395
- "}",
1396
- self->server_name_.get());
1397
- RefCountedPtr<ServiceConfig> service_config =
1398
- ServiceConfig::Create(json, &error);
1399
- gpr_free(json);
1400
- if (error != GRPC_ERROR_NONE) {
1401
- self->service_config_watcher_->OnError(error);
1402
- } else {
1403
- self->service_config_watcher_->OnServiceConfigChanged(
1404
- std::move(service_config));
1405
- }
1406
- self->Unref();
1407
- }
1408
-
1409
2330
  void* XdsClient::ChannelArgCopy(void* p) {
1410
2331
  XdsClient* xds_client = static_cast<XdsClient*>(p);
1411
- xds_client->Ref().release();
2332
+ xds_client->Ref(DEBUG_LOCATION, "channel arg").release();
1412
2333
  return p;
1413
2334
  }
1414
2335
 
1415
2336
  void XdsClient::ChannelArgDestroy(void* p) {
1416
2337
  XdsClient* xds_client = static_cast<XdsClient*>(p);
1417
- xds_client->Unref();
2338
+ xds_client->Unref(DEBUG_LOCATION, "channel arg");
1418
2339
  }
1419
2340
 
1420
2341
  int XdsClient::ChannelArgCmp(void* p, void* q) { return GPR_ICMP(p, q); }
@@ -1437,4 +2358,10 @@ RefCountedPtr XdsClient::GetFromChannelArgs(
1437
2358
  return nullptr;
1438
2359
  }
1439
2360
 
2361
+ grpc_channel_args* XdsClient::RemoveFromChannelArgs(
2362
+ const grpc_channel_args& args) {
2363
+ const char* arg_name = GRPC_ARG_XDS_CLIENT;
2364
+ return grpc_channel_args_copy_and_remove(&args, &arg_name, 1);
2365
+ }
2366
+
1440
2367
  } // namespace grpc_core