grpc 1.37.1 → 1.38.0.pre1

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

Potentially problematic release.


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

Files changed (544) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +64 -58
  3. data/include/grpc/event_engine/README.md +38 -0
  4. data/include/grpc/event_engine/channel_args.h +28 -0
  5. data/include/grpc/event_engine/event_engine.h +336 -0
  6. data/include/grpc/event_engine/port.h +39 -0
  7. data/include/grpc/event_engine/slice_allocator.h +81 -0
  8. data/include/grpc/grpc.h +2 -2
  9. data/include/grpc/grpc_security_constants.h +14 -0
  10. data/include/grpc/impl/codegen/grpc_types.h +11 -0
  11. data/include/grpc/impl/codegen/port_platform.h +5 -0
  12. data/include/grpc/module.modulemap +14 -14
  13. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
  14. data/src/core/ext/filters/client_channel/channel_connectivity.cc +177 -202
  15. data/src/core/ext/filters/client_channel/client_channel.cc +628 -3101
  16. data/src/core/ext/filters/client_channel/client_channel.h +489 -55
  17. data/src/core/ext/filters/client_channel/client_channel_channelz.h +1 -1
  18. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -1
  19. data/src/core/ext/filters/client_channel/config_selector.h +1 -1
  20. data/src/core/ext/filters/client_channel/connector.h +1 -1
  21. data/src/core/ext/filters/client_channel/dynamic_filters.cc +9 -10
  22. data/src/core/ext/filters/client_channel/dynamic_filters.h +3 -3
  23. data/src/core/ext/filters/client_channel/health/health_check_client.cc +26 -27
  24. data/src/core/ext/filters/client_channel/health/health_check_client.h +27 -26
  25. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +24 -21
  26. data/src/core/ext/filters/client_channel/lb_policy.cc +1 -1
  27. data/src/core/ext/filters/client_channel/lb_policy.h +4 -4
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -6
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +46 -43
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -1
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +5 -5
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +14 -12
  34. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +4 -4
  35. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +1 -1
  36. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +15 -15
  37. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +36 -30
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +23 -23
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +31 -46
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +84 -61
  41. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -1
  42. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -4
  43. data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -1
  44. data/src/core/ext/filters/client_channel/resolver.h +2 -2
  45. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +23 -15
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +3 -3
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +14 -14
  50. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +33 -24
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
  52. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +1 -1
  53. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  54. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +17 -9
  55. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +20 -28
  56. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +7 -5
  57. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +13 -11
  58. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -1
  59. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +43 -28
  60. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +32 -239
  61. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +20 -49
  62. data/src/core/ext/filters/client_channel/retry_filter.cc +2188 -0
  63. data/src/core/ext/filters/client_channel/retry_filter.h +30 -0
  64. data/src/core/ext/filters/client_channel/retry_service_config.cc +287 -0
  65. data/src/core/ext/filters/client_channel/retry_service_config.h +90 -0
  66. data/src/core/ext/filters/client_channel/server_address.cc +1 -1
  67. data/src/core/ext/filters/client_channel/service_config.cc +15 -14
  68. data/src/core/ext/filters/client_channel/service_config.h +7 -6
  69. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +5 -4
  70. data/src/core/ext/filters/client_channel/service_config_parser.cc +6 -6
  71. data/src/core/ext/filters/client_channel/service_config_parser.h +7 -4
  72. data/src/core/ext/filters/client_channel/subchannel.cc +17 -16
  73. data/src/core/ext/filters/client_channel/subchannel.h +7 -6
  74. data/src/core/ext/filters/client_idle/client_idle_filter.cc +16 -15
  75. data/src/core/ext/filters/deadline/deadline_filter.cc +10 -10
  76. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -18
  77. data/src/core/ext/filters/fault_injection/service_config_parser.cc +5 -5
  78. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  79. data/src/core/ext/filters/http/client/http_client_filter.cc +28 -21
  80. data/src/core/ext/filters/http/client_authority_filter.cc +3 -3
  81. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +23 -22
  82. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +21 -21
  83. data/src/core/ext/filters/http/server/http_server_filter.cc +27 -23
  84. data/src/core/ext/filters/max_age/max_age_filter.cc +12 -10
  85. data/src/core/ext/filters/message_size/message_size_filter.cc +14 -11
  86. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  87. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +4 -3
  88. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +7 -7
  89. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +7 -7
  90. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +2 -2
  91. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +1 -1
  92. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +3 -3
  93. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +44 -45
  94. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -2
  95. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +3 -4
  96. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +2 -2
  97. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +3 -4
  98. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +129 -116
  99. data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -5
  100. data/src/core/ext/transport/chttp2/transport/context_list.h +4 -4
  101. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  102. data/src/core/ext/transport/chttp2/transport/flow_control.h +8 -8
  103. data/src/core/ext/transport/chttp2/transport/frame_data.cc +8 -8
  104. data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -10
  105. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +7 -8
  106. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +6 -6
  107. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +7 -8
  108. data/src/core/ext/transport/chttp2/transport/frame_ping.h +7 -6
  109. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +7 -7
  110. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +6 -6
  111. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -5
  112. data/src/core/ext/transport/chttp2/transport/frame_settings.h +6 -6
  113. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -6
  114. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +4 -6
  115. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +237 -208
  116. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +10 -10
  117. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +4 -3
  118. data/src/core/ext/transport/chttp2/transport/hpack_table.h +4 -4
  119. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +2 -2
  120. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +2 -2
  121. data/src/core/ext/transport/chttp2/transport/internal.h +31 -27
  122. data/src/core/ext/transport/chttp2/transport/parsing.cc +63 -56
  123. data/src/core/ext/transport/chttp2/transport/writing.cc +7 -3
  124. data/src/core/ext/transport/inproc/inproc_transport.cc +30 -29
  125. data/src/core/ext/xds/certificate_provider_factory.h +1 -1
  126. data/src/core/ext/xds/certificate_provider_store.h +3 -3
  127. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +3 -3
  128. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +2 -2
  129. data/src/core/ext/xds/xds_api.cc +101 -93
  130. data/src/core/ext/xds/xds_api.h +6 -6
  131. data/src/core/ext/xds/xds_bootstrap.cc +97 -159
  132. data/src/core/ext/xds/xds_bootstrap.h +19 -24
  133. data/src/core/ext/xds/xds_certificate_provider.cc +4 -4
  134. data/src/core/ext/xds/xds_certificate_provider.h +4 -4
  135. data/src/core/ext/xds/xds_channel_args.h +5 -2
  136. data/src/core/ext/xds/xds_client.cc +310 -178
  137. data/src/core/ext/xds/xds_client.h +41 -27
  138. data/src/core/ext/xds/xds_client_stats.h +3 -2
  139. data/src/core/ext/xds/xds_server_config_fetcher.cc +34 -20
  140. data/src/core/lib/{iomgr → address_utils}/parse_address.cc +17 -17
  141. data/src/core/lib/{iomgr → address_utils}/parse_address.h +7 -7
  142. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.cc +3 -20
  143. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.h +6 -11
  144. data/src/core/lib/channel/channel_stack.cc +10 -9
  145. data/src/core/lib/channel/channel_stack.h +10 -9
  146. data/src/core/lib/channel/channel_stack_builder.cc +2 -2
  147. data/src/core/lib/channel/channel_stack_builder.h +1 -1
  148. data/src/core/lib/channel/channelz.cc +21 -13
  149. data/src/core/lib/channel/connected_channel.cc +4 -4
  150. data/src/core/lib/channel/handshaker.cc +7 -6
  151. data/src/core/lib/channel/handshaker.h +5 -5
  152. data/src/core/lib/event_engine/slice_allocator.cc +59 -0
  153. data/src/core/lib/event_engine/sockaddr.cc +38 -0
  154. data/src/core/lib/gprpp/ref_counted.h +28 -14
  155. data/src/core/lib/gprpp/status_helper.cc +407 -0
  156. data/src/core/lib/gprpp/status_helper.h +180 -0
  157. data/src/core/lib/http/httpcli.cc +11 -11
  158. data/src/core/lib/http/httpcli_security_connector.cc +11 -7
  159. data/src/core/lib/http/parser.cc +16 -16
  160. data/src/core/lib/http/parser.h +4 -4
  161. data/src/core/lib/iomgr/buffer_list.cc +7 -9
  162. data/src/core/lib/iomgr/buffer_list.h +4 -5
  163. data/src/core/lib/iomgr/call_combiner.cc +15 -12
  164. data/src/core/lib/iomgr/call_combiner.h +12 -14
  165. data/src/core/lib/iomgr/cfstream_handle.cc +3 -3
  166. data/src/core/lib/iomgr/cfstream_handle.h +1 -1
  167. data/src/core/lib/iomgr/closure.h +7 -6
  168. data/src/core/lib/iomgr/combiner.cc +14 -12
  169. data/src/core/lib/iomgr/combiner.h +2 -2
  170. data/src/core/lib/iomgr/endpoint.cc +1 -1
  171. data/src/core/lib/iomgr/endpoint.h +2 -2
  172. data/src/core/lib/iomgr/endpoint_cfstream.cc +11 -13
  173. data/src/core/lib/iomgr/endpoint_pair_windows.cc +1 -1
  174. data/src/core/lib/iomgr/error.cc +167 -61
  175. data/src/core/lib/iomgr/error.h +217 -106
  176. data/src/core/lib/iomgr/error_cfstream.cc +3 -2
  177. data/src/core/lib/iomgr/error_cfstream.h +2 -2
  178. data/src/core/lib/iomgr/error_internal.h +5 -1
  179. data/src/core/lib/iomgr/ev_apple.cc +5 -5
  180. data/src/core/lib/iomgr/ev_epoll1_linux.cc +19 -19
  181. data/src/core/lib/iomgr/ev_epollex_linux.cc +48 -45
  182. data/src/core/lib/iomgr/ev_poll_posix.cc +26 -23
  183. data/src/core/lib/iomgr/ev_posix.cc +9 -8
  184. data/src/core/lib/iomgr/ev_posix.h +9 -9
  185. data/src/core/lib/iomgr/exec_ctx.cc +4 -4
  186. data/src/core/lib/iomgr/exec_ctx.h +1 -1
  187. data/src/core/lib/iomgr/executor.cc +8 -8
  188. data/src/core/lib/iomgr/executor.h +2 -2
  189. data/src/core/lib/iomgr/iomgr.cc +1 -1
  190. data/src/core/lib/iomgr/iomgr.h +1 -1
  191. data/src/core/lib/iomgr/iomgr_custom.cc +1 -1
  192. data/src/core/lib/iomgr/iomgr_internal.cc +2 -2
  193. data/src/core/lib/iomgr/iomgr_internal.h +3 -3
  194. data/src/core/lib/iomgr/iomgr_posix.cc +1 -1
  195. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
  196. data/src/core/lib/iomgr/iomgr_windows.cc +1 -1
  197. data/src/core/lib/iomgr/load_file.cc +4 -4
  198. data/src/core/lib/iomgr/load_file.h +2 -2
  199. data/src/core/lib/iomgr/lockfree_event.cc +5 -5
  200. data/src/core/lib/iomgr/lockfree_event.h +1 -1
  201. data/src/core/lib/iomgr/pollset.cc +5 -5
  202. data/src/core/lib/iomgr/pollset.h +9 -9
  203. data/src/core/lib/iomgr/pollset_custom.cc +5 -5
  204. data/src/core/lib/iomgr/pollset_windows.cc +5 -5
  205. data/src/core/lib/iomgr/port.h +1 -1
  206. data/src/core/lib/iomgr/python_util.h +1 -1
  207. data/src/core/lib/iomgr/resolve_address.cc +3 -3
  208. data/src/core/lib/iomgr/resolve_address.h +6 -6
  209. data/src/core/lib/iomgr/resolve_address_custom.cc +10 -9
  210. data/src/core/lib/iomgr/resolve_address_custom.h +3 -3
  211. data/src/core/lib/iomgr/resolve_address_posix.cc +3 -3
  212. data/src/core/lib/iomgr/resolve_address_windows.cc +4 -4
  213. data/src/core/lib/iomgr/resource_quota.cc +11 -10
  214. data/src/core/lib/iomgr/socket_utils_common_posix.cc +22 -20
  215. data/src/core/lib/iomgr/socket_utils_posix.h +20 -20
  216. data/src/core/lib/iomgr/tcp_client_cfstream.cc +4 -4
  217. data/src/core/lib/iomgr/tcp_client_custom.cc +5 -6
  218. data/src/core/lib/iomgr/tcp_client_posix.cc +15 -17
  219. data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
  220. data/src/core/lib/iomgr/tcp_client_windows.cc +5 -5
  221. data/src/core/lib/iomgr/tcp_custom.cc +14 -16
  222. data/src/core/lib/iomgr/tcp_custom.h +13 -12
  223. data/src/core/lib/iomgr/tcp_posix.cc +36 -34
  224. data/src/core/lib/iomgr/tcp_server.cc +6 -6
  225. data/src/core/lib/iomgr/tcp_server.h +12 -11
  226. data/src/core/lib/iomgr/tcp_server_custom.cc +23 -21
  227. data/src/core/lib/iomgr/tcp_server_posix.cc +22 -21
  228. data/src/core/lib/iomgr/tcp_server_utils_posix.h +13 -12
  229. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +19 -17
  230. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +9 -9
  231. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +4 -4
  232. data/src/core/lib/iomgr/tcp_server_windows.cc +26 -25
  233. data/src/core/lib/iomgr/tcp_uv.cc +25 -23
  234. data/src/core/lib/iomgr/tcp_windows.cc +13 -13
  235. data/src/core/lib/iomgr/tcp_windows.h +2 -2
  236. data/src/core/lib/iomgr/timer_custom.cc +2 -1
  237. data/src/core/lib/iomgr/timer_custom.h +1 -1
  238. data/src/core/lib/iomgr/timer_generic.cc +6 -6
  239. data/src/core/lib/iomgr/udp_server.cc +21 -20
  240. data/src/core/lib/iomgr/unix_sockets_posix.cc +3 -3
  241. data/src/core/lib/iomgr/unix_sockets_posix.h +2 -2
  242. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +10 -7
  243. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +3 -3
  244. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +4 -4
  245. data/src/core/lib/iomgr/wakeup_fd_posix.cc +3 -3
  246. data/src/core/lib/iomgr/wakeup_fd_posix.h +8 -6
  247. data/src/core/lib/iomgr/work_serializer.h +17 -1
  248. data/src/core/lib/json/json.h +1 -1
  249. data/src/core/lib/json/json_reader.cc +4 -4
  250. data/src/core/lib/matchers/matchers.cc +39 -39
  251. data/src/core/lib/matchers/matchers.h +28 -28
  252. data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
  253. data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
  254. data/src/core/lib/security/credentials/credentials.h +2 -2
  255. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +17 -13
  256. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +13 -11
  257. data/src/core/lib/security/credentials/external/aws_request_signer.cc +2 -1
  258. data/src/core/lib/security/credentials/external/aws_request_signer.h +1 -1
  259. data/src/core/lib/security/credentials/external/external_account_credentials.cc +15 -12
  260. data/src/core/lib/security/credentials/external/external_account_credentials.h +9 -8
  261. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +5 -4
  262. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -3
  263. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +8 -8
  264. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +9 -7
  265. data/src/core/lib/security/credentials/fake/fake_credentials.cc +2 -2
  266. data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -2
  267. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +9 -9
  268. data/src/core/lib/security/credentials/iam/iam_credentials.cc +2 -2
  269. data/src/core/lib/security/credentials/iam/iam_credentials.h +2 -2
  270. data/src/core/lib/security/credentials/jwt/json_token.cc +2 -2
  271. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +3 -3
  272. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -2
  273. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +7 -5
  274. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +21 -19
  275. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -5
  276. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +5 -5
  277. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -2
  278. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +8 -7
  279. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -9
  280. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +19 -13
  281. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -0
  282. data/src/core/lib/security/credentials/xds/xds_credentials.cc +3 -3
  283. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +13 -3
  284. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -3
  285. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  286. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +12 -2
  287. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -1
  288. data/src/core/lib/security/security_connector/local/local_security_connector.cc +14 -4
  289. data/src/core/lib/security/security_connector/security_connector.h +9 -4
  290. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +16 -6
  291. data/src/core/lib/security/security_connector/ssl_utils.cc +22 -4
  292. data/src/core/lib/security/security_connector/ssl_utils.h +4 -4
  293. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +56 -60
  294. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +66 -48
  295. data/src/core/lib/security/transport/client_auth_filter.cc +18 -10
  296. data/src/core/lib/security/transport/secure_endpoint.cc +4 -4
  297. data/src/core/lib/security/transport/security_handshaker.cc +33 -32
  298. data/src/core/lib/security/transport/server_auth_filter.cc +19 -13
  299. data/src/core/lib/security/transport/tsi_error.cc +2 -1
  300. data/src/core/lib/security/transport/tsi_error.h +2 -1
  301. data/src/core/lib/security/util/json_util.cc +2 -2
  302. data/src/core/lib/security/util/json_util.h +1 -1
  303. data/src/core/lib/surface/call.cc +46 -45
  304. data/src/core/lib/surface/call.h +2 -2
  305. data/src/core/lib/surface/channel.cc +6 -6
  306. data/src/core/lib/surface/channel.h +3 -2
  307. data/src/core/lib/surface/channel_ping.cc +1 -1
  308. data/src/core/lib/surface/completion_queue.cc +46 -47
  309. data/src/core/lib/surface/completion_queue.h +2 -1
  310. data/src/core/lib/surface/lame_client.cc +11 -11
  311. data/src/core/lib/surface/lame_client.h +1 -1
  312. data/src/core/lib/surface/server.cc +28 -22
  313. data/src/core/lib/surface/server.h +16 -15
  314. data/src/core/lib/surface/validate_metadata.cc +7 -7
  315. data/src/core/lib/surface/validate_metadata.h +3 -2
  316. data/src/core/lib/surface/version.cc +4 -2
  317. data/src/core/lib/transport/byte_stream.cc +5 -5
  318. data/src/core/lib/transport/byte_stream.h +8 -8
  319. data/src/core/lib/transport/connectivity_state.cc +1 -1
  320. data/src/core/lib/transport/error_utils.cc +19 -8
  321. data/src/core/lib/transport/error_utils.h +11 -5
  322. data/src/core/lib/transport/metadata_batch.cc +37 -37
  323. data/src/core/lib/transport/metadata_batch.h +19 -18
  324. data/src/core/lib/transport/transport.cc +4 -3
  325. data/src/core/lib/transport/transport.h +4 -4
  326. data/src/core/lib/transport/transport_op_string.cc +5 -5
  327. data/src/core/tsi/alts/crypt/gsec.h +4 -0
  328. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +5 -4
  329. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +7 -6
  330. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +2 -1
  331. data/src/core/tsi/ssl_transport_security.cc +32 -14
  332. data/src/core/tsi/ssl_transport_security.h +3 -4
  333. data/src/ruby/bin/math_services_pb.rb +1 -1
  334. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  335. data/src/ruby/lib/grpc/version.rb +1 -1
  336. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +1 -1
  337. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +6 -6
  338. data/third_party/abseil-cpp/absl/algorithm/container.h +3 -3
  339. data/third_party/abseil-cpp/absl/base/attributes.h +24 -4
  340. data/third_party/abseil-cpp/absl/base/call_once.h +2 -9
  341. data/third_party/abseil-cpp/absl/base/config.h +37 -9
  342. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +24 -10
  343. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +4 -1
  344. data/third_party/abseil-cpp/absl/base/internal/endian.h +61 -0
  345. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +2 -3
  346. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +34 -32
  347. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +16 -6
  348. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +11 -2
  349. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +14 -5
  350. data/third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc +2 -2
  351. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +3 -3
  352. data/third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc +2 -2
  353. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +11 -11
  354. data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +5 -5
  355. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +1 -1
  356. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +5 -2
  357. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +43 -42
  358. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +111 -7
  359. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +0 -76
  360. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +1 -3
  361. data/third_party/abseil-cpp/absl/base/log_severity.h +4 -4
  362. data/third_party/abseil-cpp/absl/base/macros.h +11 -0
  363. data/third_party/abseil-cpp/absl/base/optimization.h +10 -7
  364. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  365. data/third_party/abseil-cpp/absl/base/port.h +0 -1
  366. data/third_party/abseil-cpp/absl/base/thread_annotations.h +1 -1
  367. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -2
  368. data/third_party/abseil-cpp/absl/container/inlined_vector.h +5 -3
  369. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +1 -1
  370. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +5 -1
  371. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +2 -1
  372. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +2 -1
  373. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +141 -66
  374. data/third_party/abseil-cpp/absl/container/internal/layout.h +4 -4
  375. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -1
  376. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +136 -136
  377. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +16 -12
  378. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +5 -2
  379. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +3 -12
  380. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +6 -1
  381. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +3 -5
  382. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +2 -2
  383. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +2 -2
  384. data/third_party/abseil-cpp/absl/hash/internal/city.cc +15 -12
  385. data/third_party/abseil-cpp/absl/hash/internal/city.h +1 -19
  386. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +25 -10
  387. data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -37
  388. data/third_party/abseil-cpp/absl/hash/internal/wyhash.cc +111 -0
  389. data/third_party/abseil-cpp/absl/hash/internal/wyhash.h +48 -0
  390. data/third_party/abseil-cpp/absl/meta/type_traits.h +16 -2
  391. data/third_party/abseil-cpp/absl/numeric/bits.h +177 -0
  392. data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -3
  393. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +358 -0
  394. data/third_party/abseil-cpp/absl/numeric/internal/representation.h +55 -0
  395. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +18 -0
  396. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -7
  397. data/third_party/abseil-cpp/absl/status/status.cc +29 -22
  398. data/third_party/abseil-cpp/absl/status/status.h +81 -20
  399. data/third_party/abseil-cpp/absl/status/statusor.h +3 -3
  400. data/third_party/abseil-cpp/absl/strings/charconv.cc +5 -5
  401. data/third_party/abseil-cpp/absl/strings/cord.cc +326 -371
  402. data/third_party/abseil-cpp/absl/strings/cord.h +182 -64
  403. data/third_party/abseil-cpp/absl/strings/escaping.cc +4 -4
  404. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +6 -6
  405. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +83 -0
  406. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +387 -17
  407. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +146 -0
  408. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +897 -0
  409. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +589 -0
  410. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +114 -0
  411. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +14 -0
  412. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -0
  413. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +15 -1
  414. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +19 -4
  415. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +14 -0
  416. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +36 -18
  417. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +14 -0
  418. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +14 -0
  419. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +14 -0
  420. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +15 -40
  421. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +64 -0
  422. data/third_party/abseil-cpp/absl/strings/match.cc +6 -3
  423. data/third_party/abseil-cpp/absl/strings/match.h +16 -6
  424. data/third_party/abseil-cpp/absl/strings/numbers.cc +132 -4
  425. data/third_party/abseil-cpp/absl/strings/numbers.h +10 -10
  426. data/third_party/abseil-cpp/absl/strings/str_join.h +1 -1
  427. data/third_party/abseil-cpp/absl/strings/str_split.h +38 -4
  428. data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +154 -0
  429. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -1
  430. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +2 -2
  431. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +4 -4
  432. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -65
  433. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -6
  434. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +71 -59
  435. data/third_party/abseil-cpp/absl/synchronization/mutex.h +79 -62
  436. data/third_party/abseil-cpp/absl/time/clock.cc +146 -130
  437. data/third_party/abseil-cpp/absl/time/clock.h +2 -2
  438. data/third_party/abseil-cpp/absl/time/duration.cc +3 -2
  439. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +7 -11
  440. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +7 -1
  441. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +4 -4
  442. data/third_party/abseil-cpp/absl/time/time.cc +4 -3
  443. data/third_party/abseil-cpp/absl/time/time.h +26 -24
  444. data/third_party/abseil-cpp/absl/types/internal/variant.h +1 -1
  445. data/third_party/abseil-cpp/absl/types/variant.h +9 -4
  446. data/third_party/boringssl-with-bazel/err_data.c +477 -461
  447. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +1 -1
  448. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +1 -1
  449. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +18 -8
  450. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -2
  451. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +5 -0
  452. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -1
  453. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +1 -1
  454. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +1 -88
  455. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +14 -3
  456. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +119 -273
  457. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +87 -80
  458. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +1 -0
  459. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +1 -1
  460. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +11 -3
  461. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +25 -2
  462. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +10 -2
  463. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/md32_common.h +4 -43
  464. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +4 -0
  465. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +0 -1
  466. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +0 -4
  467. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +104 -93
  468. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/internal.h +39 -0
  469. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +43 -46
  470. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +43 -46
  471. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +33 -22
  472. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c +9 -8
  473. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +9 -8
  474. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +17 -13
  475. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +1 -22
  476. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +2 -1
  477. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +26 -7
  478. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/fips.c +79 -0
  479. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +14 -9
  480. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +45 -48
  481. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +38 -43
  482. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +37 -45
  483. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +103 -42
  484. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +58 -37
  485. data/third_party/boringssl-with-bazel/src/crypto/internal.h +65 -0
  486. data/third_party/boringssl-with-bazel/src/crypto/mem.c +14 -0
  487. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +3 -3
  488. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +1 -1
  489. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +95 -48
  490. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +1 -1
  491. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +0 -28
  492. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +19 -0
  493. data/third_party/boringssl-with-bazel/src/crypto/x509/t_req.c +2 -0
  494. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +19 -25
  495. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +3 -2
  496. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +39 -89
  497. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +9 -16
  498. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +1 -1
  499. data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +21 -17
  500. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +7 -25
  501. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +5 -0
  502. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +25 -22
  503. data/third_party/boringssl-with-bazel/src/crypto/x509/x_val.c +2 -0
  504. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -4
  505. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
  506. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +1 -0
  507. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +0 -3
  508. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +120 -41
  509. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +9 -0
  510. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +0 -8
  511. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +24 -4
  512. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +5 -2
  513. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +19 -0
  514. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +3 -2
  515. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +1 -38
  516. data/third_party/boringssl-with-bazel/src/{crypto/x509/x509_r2x.c → include/openssl/evp_errors.h} +41 -58
  517. data/third_party/boringssl-with-bazel/src/include/openssl/obj.h +24 -5
  518. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +2 -0
  519. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +9 -1
  520. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +2 -2
  521. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +185 -17
  522. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +1 -0
  523. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +416 -121
  524. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +2 -0
  525. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +5 -0
  526. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +444 -0
  527. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +244 -1
  528. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +43 -12
  529. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +149 -8
  530. data/third_party/boringssl-with-bazel/src/ssl/internal.h +220 -46
  531. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +7 -1
  532. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -6
  533. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +23 -26
  534. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +74 -15
  535. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +98 -64
  536. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +34 -4
  537. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +205 -100
  538. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +4 -2
  539. metadata +68 -45
  540. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +0 -88
  541. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +0 -88
  542. data/third_party/abseil-cpp/absl/base/internal/bits.h +0 -219
  543. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +0 -249
  544. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c +0 -29
@@ -67,22 +67,16 @@ class XdsBootstrap {
67
67
  bool ShouldUseV3() const;
68
68
  };
69
69
 
70
- // Creates bootstrap object, obtaining the bootstrap JSON as appropriate
71
- // for the environment:
72
- // - If the GRPC_XDS_BOOTSTRAP env var is set, reads the file it specifies
73
- // to obtain the bootstrap JSON.
74
- // - Otherwise, if the GRPC_XDS_BOOTSTRAP_CONFIG env var is set, reads the
75
- // content of that env var to obtain the bootstrap JSON.
76
- // - Otherwise, the JSON will be read from fallback_config (if non-null).
70
+ // Creates bootstrap object from json_string.
77
71
  // If *error is not GRPC_ERROR_NONE after returning, then there was an
78
- // error (e.g., no config found or error reading the file).
79
- static std::unique_ptr<XdsBootstrap> Create(XdsClient* client,
80
- TraceFlag* tracer,
81
- const char* fallback_config,
82
- grpc_error** error);
72
+ // error parsing the contents.
73
+ static std::unique_ptr<XdsBootstrap> Create(absl::string_view json_string,
74
+ grpc_error_handle* error);
83
75
 
84
- // Do not instantiate directly -- use ReadFromFile() above instead.
85
- XdsBootstrap(Json json, grpc_error** error);
76
+ // Do not instantiate directly -- use Create() above instead.
77
+ XdsBootstrap(Json json, grpc_error_handle* error);
78
+
79
+ std::string ToString() const;
86
80
 
87
81
  // TODO(roth): We currently support only one server. Fix this when we
88
82
  // add support for fallback for the xds channel.
@@ -98,16 +92,17 @@ class XdsBootstrap {
98
92
  }
99
93
 
100
94
  private:
101
- grpc_error* ParseXdsServerList(Json* json);
102
- grpc_error* ParseXdsServer(Json* json, size_t idx);
103
- grpc_error* ParseChannelCredsArray(Json* json, XdsServer* server);
104
- grpc_error* ParseChannelCreds(Json* json, size_t idx, XdsServer* server);
105
- grpc_error* ParseServerFeaturesArray(Json* json, XdsServer* server);
106
- grpc_error* ParseNode(Json* json);
107
- grpc_error* ParseLocality(Json* json);
108
- grpc_error* ParseCertificateProviders(Json* json);
109
- grpc_error* ParseCertificateProvider(const std::string& instance_name,
110
- Json* certificate_provider_json);
95
+ grpc_error_handle ParseXdsServerList(Json* json);
96
+ grpc_error_handle ParseXdsServer(Json* json, size_t idx);
97
+ grpc_error_handle ParseChannelCredsArray(Json* json, XdsServer* server);
98
+ grpc_error_handle ParseChannelCreds(Json* json, size_t idx,
99
+ XdsServer* server);
100
+ grpc_error_handle ParseServerFeaturesArray(Json* json, XdsServer* server);
101
+ grpc_error_handle ParseNode(Json* json);
102
+ grpc_error_handle ParseLocality(Json* json);
103
+ grpc_error_handle ParseCertificateProviders(Json* json);
104
+ grpc_error_handle ParseCertificateProvider(const std::string& instance_name,
105
+ Json* certificate_provider_json);
111
106
 
112
107
  absl::InlinedVector<XdsServer, 1> servers_;
113
108
  std::unique_ptr<Node> node_;
@@ -51,8 +51,8 @@ class RootCertificatesWatcher
51
51
  }
52
52
  }
53
53
 
54
- void OnError(grpc_error* root_cert_error,
55
- grpc_error* identity_cert_error) override {
54
+ void OnError(grpc_error_handle root_cert_error,
55
+ grpc_error_handle identity_cert_error) override {
56
56
  if (root_cert_error != GRPC_ERROR_NONE) {
57
57
  parent_->SetErrorForCert(cert_name_, root_cert_error /* pass the ref */,
58
58
  absl::nullopt);
@@ -86,8 +86,8 @@ class IdentityCertificatesWatcher
86
86
  }
87
87
  }
88
88
 
89
- void OnError(grpc_error* root_cert_error,
90
- grpc_error* identity_cert_error) override {
89
+ void OnError(grpc_error_handle root_cert_error,
90
+ grpc_error_handle identity_cert_error) override {
91
91
  if (identity_cert_error != GRPC_ERROR_NONE) {
92
92
  parent_->SetErrorForCert(cert_name_, absl::nullopt,
93
93
  identity_cert_error /* pass the ref */);
@@ -127,9 +127,11 @@ class XdsCertificateProvider : public grpc_tls_certificate_provider {
127
127
  void WatchStatusCallback(std::string cert_name, bool root_being_watched,
128
128
  bool identity_being_watched);
129
129
 
130
+ RefCountedPtr<grpc_tls_certificate_distributor> distributor_;
131
+
130
132
  Mutex mu_;
131
133
  std::map<std::string /*cert_name*/, std::unique_ptr<ClusterCertificateState>>
132
- certificate_state_map_;
134
+ certificate_state_map_ ABSL_GUARDED_BY(mu_);
133
135
 
134
136
  // Use a separate mutex for san_matchers_ to avoid deadlocks since
135
137
  // san_matchers_ needs to be accessed when a handshake is being done and we
@@ -141,9 +143,7 @@ class XdsCertificateProvider : public grpc_tls_certificate_provider {
141
143
  // subject_alternative_names_matchers()
142
144
  Mutex san_matchers_mu_;
143
145
  std::map<std::string /*cluster_name*/, std::vector<StringMatcher>>
144
- san_matcher_map_;
145
-
146
- RefCountedPtr<grpc_tls_certificate_distributor> distributor_;
146
+ san_matcher_map_ ABSL_GUARDED_BY(san_matchers_mu_);
147
147
  };
148
148
 
149
149
  } // namespace grpc_core
@@ -17,8 +17,11 @@
17
17
  #ifndef GRPC_CORE_EXT_XDS_XDS_CHANNEL_ARGS_H
18
18
  #define GRPC_CORE_EXT_XDS_XDS_CHANNEL_ARGS_H
19
19
 
20
- // Pointer channel arg containing a ref to the XdsClient object.
21
- #define GRPC_ARG_XDS_CLIENT "grpc.xds_client"
20
+ // Specifies channel args for the xDS client.
21
+ // Used only when GRPC_ARG_TEST_ONLY_DO_NOT_USE_IN_PROD_XDS_BOOTSTRAP_CONFIG
22
+ // is set.
23
+ #define GRPC_ARG_TEST_ONLY_DO_NOT_USE_IN_PROD_XDS_CLIENT_CHANNEL_ARGS \
24
+ "grpc.xds_client_channel_args"
22
25
 
23
26
  // Timeout in milliseconds to wait for a resource to be returned from
24
27
  // the xds server before assuming that it does not exist.
@@ -1,20 +1,18 @@
1
- /*
2
- *
3
- * Copyright 2018 gRPC authors.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License");
6
- * you may not use this file except in compliance with the License.
7
- * You may obtain a copy of the License at
8
- *
9
- * http://www.apache.org/licenses/LICENSE-2.0
10
- *
11
- * Unless required by applicable law or agreed to in writing, software
12
- * distributed under the License is distributed on an "AS IS" BASIS,
13
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- * See the License for the specific language governing permissions and
15
- * limitations under the License.
16
- *
17
- */
1
+ //
2
+ // Copyright 2018 gRPC authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
18
16
 
19
17
  #include <grpc/support/port_platform.h>
20
18
 
@@ -40,16 +38,17 @@
40
38
  #include "src/core/ext/xds/xds_client.h"
41
39
  #include "src/core/ext/xds/xds_client_stats.h"
42
40
  #include "src/core/ext/xds/xds_http_filters.h"
41
+ #include "src/core/lib/address_utils/sockaddr_utils.h"
43
42
  #include "src/core/lib/backoff/backoff.h"
44
43
  #include "src/core/lib/channel/channel_args.h"
45
44
  #include "src/core/lib/channel/channel_stack.h"
45
+ #include "src/core/lib/gpr/env.h"
46
46
  #include "src/core/lib/gpr/string.h"
47
47
  #include "src/core/lib/gprpp/memory.h"
48
48
  #include "src/core/lib/gprpp/orphanable.h"
49
49
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
50
50
  #include "src/core/lib/gprpp/sync.h"
51
51
  #include "src/core/lib/iomgr/sockaddr.h"
52
- #include "src/core/lib/iomgr/sockaddr_utils.h"
53
52
  #include "src/core/lib/iomgr/timer.h"
54
53
  #include "src/core/lib/slice/slice_internal.h"
55
54
  #include "src/core/lib/slice/slice_string_helpers.h"
@@ -72,9 +71,9 @@ TraceFlag grpc_xds_client_refcount_trace(false, "xds_client_refcount");
72
71
  namespace {
73
72
 
74
73
  Mutex* g_mu = nullptr;
75
- const grpc_channel_args* g_channel_args = nullptr;
76
- XdsClient* g_xds_client = nullptr;
77
- char* g_fallback_bootstrap_config = nullptr;
74
+ const grpc_channel_args* g_channel_args ABSL_GUARDED_BY(*g_mu) = nullptr;
75
+ XdsClient* g_xds_client ABSL_GUARDED_BY(*g_mu) = nullptr;
76
+ char* g_fallback_bootstrap_config ABSL_GUARDED_BY(*g_mu) = nullptr;
78
77
 
79
78
  } // namespace
80
79
 
@@ -102,8 +101,8 @@ class XdsClient::ChannelState::RetryableCall
102
101
  private:
103
102
  void StartNewCallLocked();
104
103
  void StartRetryTimerLocked();
105
- static void OnRetryTimer(void* arg, grpc_error* error);
106
- void OnRetryTimerLocked(grpc_error* error);
104
+ static void OnRetryTimer(void* arg, grpc_error_handle error);
105
+ void OnRetryTimerLocked(grpc_error_handle error);
107
106
 
108
107
  // The wrapped xds call that talks to the xds server. It's instantiated
109
108
  // every time we start a new call. It's null during call retry backoff.
@@ -135,9 +134,11 @@ class XdsClient::ChannelState::AdsCallState
135
134
  XdsClient* xds_client() const { return chand()->xds_client(); }
136
135
  bool seen_response() const { return seen_response_; }
137
136
 
138
- void Subscribe(const std::string& type_url, const std::string& name);
139
- void Unsubscribe(const std::string& type_url, const std::string& name,
140
- bool delay_unsubscription);
137
+ void SubscribeLocked(const std::string& type_url, const std::string& name)
138
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
139
+ void UnsubscribeLocked(const std::string& type_url, const std::string& name,
140
+ bool delay_unsubscription)
141
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
141
142
 
142
143
  bool HasSubscribedResources() const;
143
144
 
@@ -178,7 +179,7 @@ class XdsClient::ChannelState::AdsCallState
178
179
  }
179
180
 
180
181
  private:
181
- static void OnTimer(void* arg, grpc_error* error) {
182
+ static void OnTimer(void* arg, grpc_error_handle error) {
182
183
  ResourceState* self = static_cast<ResourceState*>(arg);
183
184
  {
184
185
  MutexLock lock(&self->ads_calld_->xds_client()->mu_);
@@ -188,10 +189,11 @@ class XdsClient::ChannelState::AdsCallState
188
189
  self->Unref(DEBUG_LOCATION, "timer");
189
190
  }
190
191
 
191
- void OnTimerLocked(grpc_error* error) {
192
+ void OnTimerLocked(grpc_error_handle error)
193
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
192
194
  if (error == GRPC_ERROR_NONE && timer_pending_) {
193
195
  timer_pending_ = false;
194
- grpc_error* watcher_error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
196
+ grpc_error_handle watcher_error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
195
197
  absl::StrFormat(
196
198
  "timeout obtaining resource {type=%s name=%s} from xds server",
197
199
  type_url_, name_)
@@ -200,7 +202,7 @@ class XdsClient::ChannelState::AdsCallState
200
202
  watcher_error, GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
201
203
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
202
204
  gpr_log(GPR_INFO, "[xds_client %p] %s", ads_calld_->xds_client(),
203
- grpc_error_string(watcher_error));
205
+ grpc_error_std_string(watcher_error).c_str());
204
206
  }
205
207
  if (type_url_ == XdsApi::kLdsTypeUrl) {
206
208
  ListenerState& state = ads_calld_->xds_client()->listener_map_[name_];
@@ -250,30 +252,38 @@ class XdsClient::ChannelState::AdsCallState
250
252
 
251
253
  // Nonce and error for this resource type.
252
254
  std::string nonce;
253
- grpc_error* error = GRPC_ERROR_NONE;
255
+ grpc_error_handle error = GRPC_ERROR_NONE;
254
256
 
255
257
  // Subscribed resources of this type.
256
258
  std::map<std::string /* name */, OrphanablePtr<ResourceState>>
257
259
  subscribed_resources;
258
260
  };
259
261
 
260
- void SendMessageLocked(const std::string& type_url);
261
-
262
- void AcceptLdsUpdate(std::string version, grpc_millis update_time,
263
- XdsApi::LdsUpdateMap lds_update_map);
264
- void AcceptRdsUpdate(std::string version, grpc_millis update_time,
265
- XdsApi::RdsUpdateMap rds_update_map);
266
- void AcceptCdsUpdate(std::string version, grpc_millis update_time,
267
- XdsApi::CdsUpdateMap cds_update_map);
268
- void AcceptEdsUpdate(std::string version, grpc_millis update_time,
269
- XdsApi::EdsUpdateMap eds_update_map);
270
-
271
- static void OnRequestSent(void* arg, grpc_error* error);
272
- void OnRequestSentLocked(grpc_error* error);
273
- static void OnResponseReceived(void* arg, grpc_error* error);
274
- bool OnResponseReceivedLocked();
275
- static void OnStatusReceived(void* arg, grpc_error* error);
276
- void OnStatusReceivedLocked(grpc_error* error);
262
+ void SendMessageLocked(const std::string& type_url)
263
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
264
+
265
+ void AcceptLdsUpdateLocked(std::string version, grpc_millis update_time,
266
+ XdsApi::LdsUpdateMap lds_update_map)
267
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
268
+ void AcceptRdsUpdateLocked(std::string version, grpc_millis update_time,
269
+ XdsApi::RdsUpdateMap rds_update_map)
270
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
271
+ void AcceptCdsUpdateLocked(std::string version, grpc_millis update_time,
272
+ XdsApi::CdsUpdateMap cds_update_map)
273
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
274
+ void AcceptEdsUpdateLocked(std::string version, grpc_millis update_time,
275
+ XdsApi::EdsUpdateMap eds_update_map)
276
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
277
+
278
+ static void OnRequestSent(void* arg, grpc_error_handle error);
279
+ void OnRequestSentLocked(grpc_error_handle error)
280
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
281
+ static void OnResponseReceived(void* arg, grpc_error_handle error);
282
+ bool OnResponseReceivedLocked()
283
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
284
+ static void OnStatusReceived(void* arg, grpc_error_handle error);
285
+ void OnStatusReceivedLocked(grpc_error_handle error)
286
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
277
287
 
278
288
  bool IsCurrentCallOnChannel() const;
279
289
 
@@ -346,12 +356,15 @@ class XdsClient::ChannelState::LrsCallState
346
356
  void Orphan() override;
347
357
 
348
358
  private:
349
- void ScheduleNextReportLocked();
350
- static void OnNextReportTimer(void* arg, grpc_error* error);
351
- bool OnNextReportTimerLocked(grpc_error* error);
352
- bool SendReportLocked();
353
- static void OnReportDone(void* arg, grpc_error* error);
354
- bool OnReportDoneLocked(grpc_error* error);
359
+ void ScheduleNextReportLocked()
360
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
361
+ static void OnNextReportTimer(void* arg, grpc_error_handle error);
362
+ bool OnNextReportTimerLocked(grpc_error_handle error)
363
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
364
+ bool SendReportLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
365
+ static void OnReportDone(void* arg, grpc_error_handle error);
366
+ bool OnReportDoneLocked(grpc_error_handle error)
367
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
355
368
 
356
369
  bool IsCurrentReporterOnCall() const {
357
370
  return this == parent_->reporter_.get();
@@ -370,12 +383,15 @@ class XdsClient::ChannelState::LrsCallState
370
383
  grpc_closure on_report_done_;
371
384
  };
372
385
 
373
- static void OnInitialRequestSent(void* arg, grpc_error* error);
374
- void OnInitialRequestSentLocked();
375
- static void OnResponseReceived(void* arg, grpc_error* error);
376
- bool OnResponseReceivedLocked();
377
- static void OnStatusReceived(void* arg, grpc_error* error);
378
- void OnStatusReceivedLocked(grpc_error* error);
386
+ static void OnInitialRequestSent(void* arg, grpc_error_handle error);
387
+ void OnInitialRequestSentLocked()
388
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
389
+ static void OnResponseReceived(void* arg, grpc_error_handle error);
390
+ bool OnResponseReceivedLocked()
391
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
392
+ static void OnStatusReceived(void* arg, grpc_error_handle error);
393
+ void OnStatusReceivedLocked(grpc_error_handle error)
394
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
379
395
 
380
396
  bool IsCurrentCallOnChannel() const;
381
397
 
@@ -431,7 +447,7 @@ class XdsClient::ChannelState::StateWatcher
431
447
  "[xds_client %p] xds channel in state:TRANSIENT_FAILURE "
432
448
  "status_message:(%s)",
433
449
  parent_->xds_client(), status.ToString().c_str());
434
- parent_->xds_client()->NotifyOnErrorLocked(
450
+ parent_->xds_client_->NotifyOnErrorLocked(
435
451
  GRPC_ERROR_CREATE_FROM_STATIC_STRING(
436
452
  "xds channel in TRANSIENT_FAILURE"));
437
453
  }
@@ -446,26 +462,13 @@ class XdsClient::ChannelState::StateWatcher
446
462
 
447
463
  namespace {
448
464
 
449
- grpc_channel* CreateXdsChannel(const XdsBootstrap::XdsServer& server) {
450
- // Build channel args.
451
- absl::InlinedVector<grpc_arg, 2> args_to_add = {
452
- grpc_channel_arg_integer_create(
453
- const_cast<char*>(GRPC_ARG_KEEPALIVE_TIME_MS),
454
- 5 * 60 * GPR_MS_PER_SEC),
455
- grpc_channel_arg_integer_create(
456
- const_cast<char*>(GRPC_ARG_CHANNELZ_IS_INTERNAL_CHANNEL), 1),
457
- };
458
- grpc_channel_args* new_args = grpc_channel_args_copy_and_add(
459
- g_channel_args, args_to_add.data(), args_to_add.size());
460
- // Create channel creds.
465
+ grpc_channel* CreateXdsChannel(grpc_channel_args* args,
466
+ const XdsBootstrap::XdsServer& server) {
461
467
  RefCountedPtr<grpc_channel_credentials> channel_creds =
462
468
  XdsChannelCredsRegistry::MakeChannelCreds(server.channel_creds_type,
463
469
  server.channel_creds_config);
464
- // Create channel.
465
- grpc_channel* channel = grpc_secure_channel_create(
466
- channel_creds.get(), server.server_uri.c_str(), new_args, nullptr);
467
- grpc_channel_args_destroy(new_args);
468
- return channel;
470
+ return grpc_secure_channel_create(channel_creds.get(),
471
+ server.server_uri.c_str(), args, nullptr);
469
472
  }
470
473
 
471
474
  } // namespace
@@ -482,7 +485,7 @@ XdsClient::ChannelState::ChannelState(WeakRefCountedPtr<XdsClient> xds_client,
482
485
  gpr_log(GPR_INFO, "[xds_client %p] creating channel to %s",
483
486
  xds_client_.get(), server.server_uri.c_str());
484
487
  }
485
- channel_ = CreateXdsChannel(server);
488
+ channel_ = CreateXdsChannel(xds_client_->args_, server);
486
489
  GPR_ASSERT(channel_ != nullptr);
487
490
  StartConnectivityWatchLocked();
488
491
  }
@@ -527,24 +530,22 @@ void XdsClient::ChannelState::MaybeStartLrsCall() {
527
530
  void XdsClient::ChannelState::StopLrsCall() { lrs_calld_.reset(); }
528
531
 
529
532
  void XdsClient::ChannelState::StartConnectivityWatchLocked() {
530
- grpc_channel_element* client_channel_elem =
531
- grpc_channel_stack_last_element(grpc_channel_get_channel_stack(channel_));
532
- GPR_ASSERT(client_channel_elem->filter == &grpc_client_channel_filter);
533
+ ClientChannel* client_channel = ClientChannel::GetFromChannel(channel_);
534
+ GPR_ASSERT(client_channel != nullptr);
533
535
  watcher_ = new StateWatcher(Ref(DEBUG_LOCATION, "ChannelState+watch"));
534
- grpc_client_channel_start_connectivity_watch(
535
- client_channel_elem, GRPC_CHANNEL_IDLE,
536
+ client_channel->AddConnectivityWatcher(
537
+ GRPC_CHANNEL_IDLE,
536
538
  OrphanablePtr<AsyncConnectivityStateWatcherInterface>(watcher_));
537
539
  }
538
540
 
539
541
  void XdsClient::ChannelState::CancelConnectivityWatchLocked() {
540
- grpc_channel_element* client_channel_elem =
541
- grpc_channel_stack_last_element(grpc_channel_get_channel_stack(channel_));
542
- GPR_ASSERT(client_channel_elem->filter == &grpc_client_channel_filter);
543
- grpc_client_channel_stop_connectivity_watch(client_channel_elem, watcher_);
542
+ ClientChannel* client_channel = ClientChannel::GetFromChannel(channel_);
543
+ GPR_ASSERT(client_channel != nullptr);
544
+ client_channel->RemoveConnectivityWatcher(watcher_);
544
545
  }
545
546
 
546
- void XdsClient::ChannelState::Subscribe(const std::string& type_url,
547
- const std::string& name) {
547
+ void XdsClient::ChannelState::SubscribeLocked(const std::string& type_url,
548
+ const std::string& name) {
548
549
  if (ads_calld_ == nullptr) {
549
550
  // Start the ADS call if this is the first request.
550
551
  ads_calld_.reset(new RetryableCall<AdsCallState>(
@@ -558,16 +559,16 @@ void XdsClient::ChannelState::Subscribe(const std::string& type_url,
558
559
  // because when the call is restarted it will resend all necessary requests.
559
560
  if (ads_calld() == nullptr) return;
560
561
  // Subscribe to this resource if the ADS call is active.
561
- ads_calld()->Subscribe(type_url, name);
562
+ ads_calld()->SubscribeLocked(type_url, name);
562
563
  }
563
564
 
564
- void XdsClient::ChannelState::Unsubscribe(const std::string& type_url,
565
- const std::string& name,
566
- bool delay_unsubscription) {
565
+ void XdsClient::ChannelState::UnsubscribeLocked(const std::string& type_url,
566
+ const std::string& name,
567
+ bool delay_unsubscription) {
567
568
  if (ads_calld_ != nullptr) {
568
569
  auto* calld = ads_calld_->calld();
569
570
  if (calld != nullptr) {
570
- calld->Unsubscribe(type_url, name, delay_unsubscription);
571
+ calld->UnsubscribeLocked(type_url, name, delay_unsubscription);
571
572
  if (!calld->HasSubscribedResources()) ads_calld_.reset();
572
573
  }
573
574
  }
@@ -650,7 +651,7 @@ void XdsClient::ChannelState::RetryableCall<T>::StartRetryTimerLocked() {
650
651
 
651
652
  template <typename T>
652
653
  void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimer(
653
- void* arg, grpc_error* error) {
654
+ void* arg, grpc_error_handle error) {
654
655
  RetryableCall* calld = static_cast<RetryableCall*>(arg);
655
656
  {
656
657
  MutexLock lock(&calld->chand_->xds_client()->mu_);
@@ -661,7 +662,7 @@ void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimer(
661
662
 
662
663
  template <typename T>
663
664
  void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimerLocked(
664
- grpc_error* error) {
665
+ grpc_error_handle error) {
665
666
  retry_timer_callback_pending_ = false;
666
667
  if (!shutting_down_ && error == GRPC_ERROR_NONE) {
667
668
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
@@ -729,16 +730,16 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
729
730
  GRPC_CLOSURE_INIT(&on_request_sent_, OnRequestSent, this,
730
731
  grpc_schedule_on_exec_ctx);
731
732
  for (const auto& p : xds_client()->listener_map_) {
732
- Subscribe(XdsApi::kLdsTypeUrl, std::string(p.first));
733
+ SubscribeLocked(XdsApi::kLdsTypeUrl, std::string(p.first));
733
734
  }
734
735
  for (const auto& p : xds_client()->route_config_map_) {
735
- Subscribe(XdsApi::kRdsTypeUrl, std::string(p.first));
736
+ SubscribeLocked(XdsApi::kRdsTypeUrl, std::string(p.first));
736
737
  }
737
738
  for (const auto& p : xds_client()->cluster_map_) {
738
- Subscribe(XdsApi::kCdsTypeUrl, std::string(p.first));
739
+ SubscribeLocked(XdsApi::kCdsTypeUrl, std::string(p.first));
739
740
  }
740
741
  for (const auto& p : xds_client()->endpoint_map_) {
741
- Subscribe(XdsApi::kEdsTypeUrl, std::string(p.first));
742
+ SubscribeLocked(XdsApi::kEdsTypeUrl, std::string(p.first));
742
743
  }
743
744
  // Op: recv initial metadata.
744
745
  op = ops;
@@ -802,7 +803,8 @@ void XdsClient::ChannelState::AdsCallState::Orphan() {
802
803
  }
803
804
 
804
805
  void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
805
- const std::string& type_url) {
806
+ const std::string& type_url)
807
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
806
808
  // Buffer message sending if an existing message is in flight.
807
809
  if (send_message_payload_ != nullptr) {
808
810
  buffered_requests_.insert(type_url);
@@ -827,7 +829,7 @@ void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
827
829
  "error=%s resources=%s",
828
830
  xds_client(), type_url.c_str(),
829
831
  xds_client()->resource_version_map_[type_url].c_str(),
830
- state.nonce.c_str(), grpc_error_string(state.error),
832
+ state.nonce.c_str(), grpc_error_std_string(state.error).c_str(),
831
833
  absl::StrJoin(resource_names, " ").c_str());
832
834
  }
833
835
  GRPC_ERROR_UNREF(state.error);
@@ -854,7 +856,7 @@ void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
854
856
  }
855
857
  }
856
858
 
857
- void XdsClient::ChannelState::AdsCallState::Subscribe(
859
+ void XdsClient::ChannelState::AdsCallState::SubscribeLocked(
858
860
  const std::string& type_url, const std::string& name) {
859
861
  auto& state = state_map_[type_url].subscribed_resources[name];
860
862
  if (state == nullptr) {
@@ -864,7 +866,7 @@ void XdsClient::ChannelState::AdsCallState::Subscribe(
864
866
  }
865
867
  }
866
868
 
867
- void XdsClient::ChannelState::AdsCallState::Unsubscribe(
869
+ void XdsClient::ChannelState::AdsCallState::UnsubscribeLocked(
868
870
  const std::string& type_url, const std::string& name,
869
871
  bool delay_unsubscription) {
870
872
  state_map_[type_url].subscribed_resources.erase(name);
@@ -894,7 +896,7 @@ XdsApi::ResourceMetadata CreateResourceMetadataAcked(
894
896
 
895
897
  } // namespace
896
898
 
897
- void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate(
899
+ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdateLocked(
898
900
  std::string version, grpc_millis update_time,
899
901
  XdsApi::LdsUpdateMap lds_update_map) {
900
902
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
@@ -978,7 +980,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate(
978
980
  }
979
981
  }
980
982
 
981
- void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdate(
983
+ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdateLocked(
982
984
  std::string version, grpc_millis update_time,
983
985
  XdsApi::RdsUpdateMap rds_update_map) {
984
986
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
@@ -1020,7 +1022,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdate(
1020
1022
  }
1021
1023
  }
1022
1024
 
1023
- void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdate(
1025
+ void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdateLocked(
1024
1026
  std::string version, grpc_millis update_time,
1025
1027
  XdsApi::CdsUpdateMap cds_update_map) {
1026
1028
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
@@ -1101,7 +1103,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdate(
1101
1103
  }
1102
1104
  }
1103
1105
 
1104
- void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdate(
1106
+ void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdateLocked(
1105
1107
  std::string version, grpc_millis update_time,
1106
1108
  XdsApi::EdsUpdateMap eds_update_map) {
1107
1109
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
@@ -1143,8 +1145,8 @@ void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdate(
1143
1145
  }
1144
1146
  }
1145
1147
 
1146
- void XdsClient::ChannelState::AdsCallState::OnRequestSent(void* arg,
1147
- grpc_error* error) {
1148
+ void XdsClient::ChannelState::AdsCallState::OnRequestSent(
1149
+ void* arg, grpc_error_handle error) {
1148
1150
  AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
1149
1151
  {
1150
1152
  MutexLock lock(&ads_calld->xds_client()->mu_);
@@ -1154,7 +1156,7 @@ void XdsClient::ChannelState::AdsCallState::OnRequestSent(void* arg,
1154
1156
  }
1155
1157
 
1156
1158
  void XdsClient::ChannelState::AdsCallState::OnRequestSentLocked(
1157
- grpc_error* error) {
1159
+ grpc_error_handle error) {
1158
1160
  if (IsCurrentCallOnChannel() && error == GRPC_ERROR_NONE) {
1159
1161
  // Clean up the sent message.
1160
1162
  grpc_byte_buffer_destroy(send_message_payload_);
@@ -1178,7 +1180,7 @@ void XdsClient::ChannelState::AdsCallState::OnRequestSentLocked(
1178
1180
  }
1179
1181
 
1180
1182
  void XdsClient::ChannelState::AdsCallState::OnResponseReceived(
1181
- void* arg, grpc_error* /* error */) {
1183
+ void* arg, grpc_error_handle /* error */) {
1182
1184
  AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
1183
1185
  bool done;
1184
1186
  {
@@ -1212,7 +1214,7 @@ bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1212
1214
  // Ignore unparsable response.
1213
1215
  gpr_log(GPR_ERROR,
1214
1216
  "[xds_client %p] Error parsing ADS response (%s) -- ignoring",
1215
- xds_client(), grpc_error_string(result.parse_error));
1217
+ xds_client(), grpc_error_std_string(result.parse_error).c_str());
1216
1218
  GRPC_ERROR_UNREF(result.parse_error);
1217
1219
  } else {
1218
1220
  grpc_millis update_time = grpc_core::ExecCtx::Get()->Now();
@@ -1221,8 +1223,8 @@ bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1221
1223
  state.nonce = std::move(result.nonce);
1222
1224
  // NACK or ACK the response.
1223
1225
  if (result.parse_error != GRPC_ERROR_NONE) {
1224
- xds_client()->UpdateResourceMetadataWithFailedParseResult(update_time,
1225
- result);
1226
+ xds_client()->UpdateResourceMetadataWithFailedParseResultLocked(
1227
+ update_time, result);
1226
1228
  GRPC_ERROR_UNREF(state.error);
1227
1229
  state.error = result.parse_error;
1228
1230
  // NACK unacceptable update.
@@ -1230,23 +1232,24 @@ bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1230
1232
  "[xds_client %p] ADS response invalid for resource type %s "
1231
1233
  "version %s, will NACK: nonce=%s error=%s",
1232
1234
  xds_client(), result.type_url.c_str(), result.version.c_str(),
1233
- state.nonce.c_str(), grpc_error_string(result.parse_error));
1235
+ state.nonce.c_str(),
1236
+ grpc_error_std_string(result.parse_error).c_str());
1234
1237
  SendMessageLocked(result.type_url);
1235
1238
  } else {
1236
1239
  seen_response_ = true;
1237
1240
  // Accept the ADS response according to the type_url.
1238
1241
  if (result.type_url == XdsApi::kLdsTypeUrl) {
1239
- AcceptLdsUpdate(result.version, update_time,
1240
- std::move(result.lds_update_map));
1242
+ AcceptLdsUpdateLocked(result.version, update_time,
1243
+ std::move(result.lds_update_map));
1241
1244
  } else if (result.type_url == XdsApi::kRdsTypeUrl) {
1242
- AcceptRdsUpdate(result.version, update_time,
1243
- std::move(result.rds_update_map));
1245
+ AcceptRdsUpdateLocked(result.version, update_time,
1246
+ std::move(result.rds_update_map));
1244
1247
  } else if (result.type_url == XdsApi::kCdsTypeUrl) {
1245
- AcceptCdsUpdate(result.version, update_time,
1246
- std::move(result.cds_update_map));
1248
+ AcceptCdsUpdateLocked(result.version, update_time,
1249
+ std::move(result.cds_update_map));
1247
1250
  } else if (result.type_url == XdsApi::kEdsTypeUrl) {
1248
- AcceptEdsUpdate(result.version, update_time,
1249
- std::move(result.eds_update_map));
1251
+ AcceptEdsUpdateLocked(result.version, update_time,
1252
+ std::move(result.eds_update_map));
1250
1253
  }
1251
1254
  xds_client()->resource_version_map_[result.type_url] =
1252
1255
  std::move(result.version);
@@ -1277,7 +1280,7 @@ bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1277
1280
  }
1278
1281
 
1279
1282
  void XdsClient::ChannelState::AdsCallState::OnStatusReceived(
1280
- void* arg, grpc_error* error) {
1283
+ void* arg, grpc_error_handle error) {
1281
1284
  AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
1282
1285
  {
1283
1286
  MutexLock lock(&ads_calld->xds_client()->mu_);
@@ -1287,14 +1290,14 @@ void XdsClient::ChannelState::AdsCallState::OnStatusReceived(
1287
1290
  }
1288
1291
 
1289
1292
  void XdsClient::ChannelState::AdsCallState::OnStatusReceivedLocked(
1290
- grpc_error* error) {
1293
+ grpc_error_handle error) {
1291
1294
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1292
1295
  char* status_details = grpc_slice_to_c_string(status_details_);
1293
1296
  gpr_log(GPR_INFO,
1294
1297
  "[xds_client %p] ADS call status received. Status = %d, details "
1295
1298
  "= '%s', (chand: %p, ads_calld: %p, call: %p), error '%s'",
1296
1299
  xds_client(), status_code_, status_details, chand(), this, call_,
1297
- grpc_error_string(error));
1300
+ grpc_error_std_string(error).c_str());
1298
1301
  gpr_free(status_details);
1299
1302
  }
1300
1303
  // Ignore status from a stale call.
@@ -1349,7 +1352,7 @@ void XdsClient::ChannelState::LrsCallState::Reporter::
1349
1352
  }
1350
1353
 
1351
1354
  void XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimer(
1352
- void* arg, grpc_error* error) {
1355
+ void* arg, grpc_error_handle error) {
1353
1356
  Reporter* self = static_cast<Reporter*>(arg);
1354
1357
  bool done;
1355
1358
  {
@@ -1360,7 +1363,7 @@ void XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimer(
1360
1363
  }
1361
1364
 
1362
1365
  bool XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimerLocked(
1363
- grpc_error* error) {
1366
+ grpc_error_handle error) {
1364
1367
  next_report_timer_callback_pending_ = false;
1365
1368
  if (error != GRPC_ERROR_NONE || !IsCurrentReporterOnCall()) {
1366
1369
  GRPC_ERROR_UNREF(error);
@@ -1425,7 +1428,7 @@ bool XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() {
1425
1428
  }
1426
1429
 
1427
1430
  void XdsClient::ChannelState::LrsCallState::Reporter::OnReportDone(
1428
- void* arg, grpc_error* error) {
1431
+ void* arg, grpc_error_handle error) {
1429
1432
  Reporter* self = static_cast<Reporter*>(arg);
1430
1433
  bool done;
1431
1434
  {
@@ -1436,7 +1439,7 @@ void XdsClient::ChannelState::LrsCallState::Reporter::OnReportDone(
1436
1439
  }
1437
1440
 
1438
1441
  bool XdsClient::ChannelState::LrsCallState::Reporter::OnReportDoneLocked(
1439
- grpc_error* error) {
1442
+ grpc_error_handle error) {
1440
1443
  grpc_byte_buffer_destroy(parent_->send_message_payload_);
1441
1444
  parent_->send_message_payload_ = nullptr;
1442
1445
  // If there are no more registered stats to report, cancel the call.
@@ -1606,7 +1609,7 @@ void XdsClient::ChannelState::LrsCallState::MaybeStartReportingLocked() {
1606
1609
  }
1607
1610
 
1608
1611
  void XdsClient::ChannelState::LrsCallState::OnInitialRequestSent(
1609
- void* arg, grpc_error* /*error*/) {
1612
+ void* arg, grpc_error_handle /*error*/) {
1610
1613
  LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
1611
1614
  {
1612
1615
  MutexLock lock(&lrs_calld->xds_client()->mu_);
@@ -1623,7 +1626,7 @@ void XdsClient::ChannelState::LrsCallState::OnInitialRequestSentLocked() {
1623
1626
  }
1624
1627
 
1625
1628
  void XdsClient::ChannelState::LrsCallState::OnResponseReceived(
1626
- void* arg, grpc_error* /*error*/) {
1629
+ void* arg, grpc_error_handle /*error*/) {
1627
1630
  LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
1628
1631
  bool done;
1629
1632
  {
@@ -1651,13 +1654,13 @@ bool XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() {
1651
1654
  bool send_all_clusters = false;
1652
1655
  std::set<std::string> new_cluster_names;
1653
1656
  grpc_millis new_load_reporting_interval;
1654
- grpc_error* parse_error = xds_client()->api_.ParseLrsResponse(
1657
+ grpc_error_handle parse_error = xds_client()->api_.ParseLrsResponse(
1655
1658
  response_slice, &send_all_clusters, &new_cluster_names,
1656
1659
  &new_load_reporting_interval);
1657
1660
  if (parse_error != GRPC_ERROR_NONE) {
1658
1661
  gpr_log(GPR_ERROR,
1659
1662
  "[xds_client %p] LRS response parsing failed. error=%s",
1660
- xds_client(), grpc_error_string(parse_error));
1663
+ xds_client(), grpc_error_std_string(parse_error).c_str());
1661
1664
  GRPC_ERROR_UNREF(parse_error);
1662
1665
  return;
1663
1666
  }
@@ -1726,7 +1729,7 @@ bool XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() {
1726
1729
  }
1727
1730
 
1728
1731
  void XdsClient::ChannelState::LrsCallState::OnStatusReceived(
1729
- void* arg, grpc_error* error) {
1732
+ void* arg, grpc_error_handle error) {
1730
1733
  LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
1731
1734
  {
1732
1735
  MutexLock lock(&lrs_calld->xds_client()->mu_);
@@ -1736,7 +1739,7 @@ void XdsClient::ChannelState::LrsCallState::OnStatusReceived(
1736
1739
  }
1737
1740
 
1738
1741
  void XdsClient::ChannelState::LrsCallState::OnStatusReceivedLocked(
1739
- grpc_error* error) {
1742
+ grpc_error_handle error) {
1740
1743
  GPR_ASSERT(call_ != nullptr);
1741
1744
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1742
1745
  char* status_details = grpc_slice_to_c_string(status_details_);
@@ -1744,7 +1747,7 @@ void XdsClient::ChannelState::LrsCallState::OnStatusReceivedLocked(
1744
1747
  "[xds_client %p] LRS call status received. Status = %d, details "
1745
1748
  "= '%s', (chand: %p, calld: %p, call: %p), error '%s'",
1746
1749
  xds_client(), status_code_, status_details, chand(), this, call_,
1747
- grpc_error_string(error));
1750
+ grpc_error_std_string(error).c_str());
1748
1751
  gpr_free(status_details);
1749
1752
  }
1750
1753
  // Ignore status from a stale call.
@@ -1769,36 +1772,41 @@ bool XdsClient::ChannelState::LrsCallState::IsCurrentCallOnChannel() const {
1769
1772
 
1770
1773
  namespace {
1771
1774
 
1772
- grpc_millis GetRequestTimeout() {
1775
+ grpc_millis GetRequestTimeout(const grpc_channel_args* args) {
1773
1776
  return grpc_channel_args_find_integer(
1774
- g_channel_args, GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS,
1777
+ args, GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS,
1775
1778
  {15000, 0, INT_MAX});
1776
1779
  }
1777
1780
 
1781
+ grpc_channel_args* ModifyChannelArgs(const grpc_channel_args* args) {
1782
+ absl::InlinedVector<grpc_arg, 2> args_to_add = {
1783
+ grpc_channel_arg_integer_create(
1784
+ const_cast<char*>(GRPC_ARG_KEEPALIVE_TIME_MS),
1785
+ 5 * 60 * GPR_MS_PER_SEC),
1786
+ grpc_channel_arg_integer_create(
1787
+ const_cast<char*>(GRPC_ARG_CHANNELZ_IS_INTERNAL_CHANNEL), 1),
1788
+ };
1789
+ return grpc_channel_args_copy_and_add(args, args_to_add.data(),
1790
+ args_to_add.size());
1791
+ }
1792
+
1778
1793
  } // namespace
1779
1794
 
1780
- XdsClient::XdsClient(grpc_error** error)
1795
+ XdsClient::XdsClient(std::unique_ptr<XdsBootstrap> bootstrap,
1796
+ const grpc_channel_args* args)
1781
1797
  : DualRefCounted<XdsClient>(
1782
1798
  GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_refcount_trace) ? "XdsClient"
1783
1799
  : nullptr),
1784
- request_timeout_(GetRequestTimeout()),
1800
+ bootstrap_(std::move(bootstrap)),
1801
+ args_(ModifyChannelArgs(args)),
1802
+ request_timeout_(GetRequestTimeout(args)),
1785
1803
  interested_parties_(grpc_pollset_set_create()),
1786
- bootstrap_(XdsBootstrap::Create(this, &grpc_xds_client_trace,
1787
- g_fallback_bootstrap_config, error)),
1788
1804
  certificate_provider_store_(MakeOrphanable<CertificateProviderStore>(
1789
- bootstrap_ == nullptr
1790
- ? CertificateProviderStore::PluginDefinitionMap()
1791
- : bootstrap_->certificate_providers())),
1792
- api_(this, &grpc_xds_client_trace,
1793
- bootstrap_ == nullptr ? nullptr : bootstrap_->node()) {
1805
+ bootstrap_->certificate_providers())),
1806
+ api_(this, &grpc_xds_client_trace, bootstrap_->node()) {
1794
1807
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1795
1808
  gpr_log(GPR_INFO, "[xds_client %p] creating xds client", this);
1796
1809
  }
1797
- if (*error != GRPC_ERROR_NONE) {
1798
- gpr_log(GPR_ERROR, "[xds_client %p] failed to read bootstrap file: %s",
1799
- this, grpc_error_string(*error));
1800
- return;
1801
- }
1802
1810
  // Create ChannelState object.
1803
1811
  chand_ = MakeOrphanable<ChannelState>(
1804
1812
  WeakRef(DEBUG_LOCATION, "XdsClient+ChannelState"), bootstrap_->server());
@@ -1808,11 +1816,13 @@ XdsClient::~XdsClient() {
1808
1816
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1809
1817
  gpr_log(GPR_INFO, "[xds_client %p] destroying xds client", this);
1810
1818
  }
1819
+ grpc_channel_args_destroy(args_);
1811
1820
  grpc_pollset_set_destroy(interested_parties_);
1812
1821
  }
1813
1822
 
1814
1823
  void XdsClient::AddChannelzLinkage(
1815
1824
  channelz::ChannelNode* parent_channelz_node) {
1825
+ MutexLock lock(&mu_);
1816
1826
  channelz::ChannelNode* xds_channelz_node =
1817
1827
  grpc_channel_get_channelz_node(chand_->channel());
1818
1828
  if (xds_channelz_node != nullptr) {
@@ -1822,6 +1832,7 @@ void XdsClient::AddChannelzLinkage(
1822
1832
 
1823
1833
  void XdsClient::RemoveChannelzLinkage(
1824
1834
  channelz::ChannelNode* parent_channelz_node) {
1835
+ MutexLock lock(&mu_);
1825
1836
  channelz::ChannelNode* xds_channelz_node =
1826
1837
  grpc_channel_get_channelz_node(chand_->channel());
1827
1838
  if (xds_channelz_node != nullptr) {
@@ -1872,7 +1883,7 @@ void XdsClient::WatchListenerData(
1872
1883
  }
1873
1884
  w->OnListenerChanged(*listener_state.update);
1874
1885
  }
1875
- chand_->Subscribe(XdsApi::kLdsTypeUrl, listener_name_str);
1886
+ chand_->SubscribeLocked(XdsApi::kLdsTypeUrl, listener_name_str);
1876
1887
  }
1877
1888
 
1878
1889
  void XdsClient::CancelListenerDataWatch(absl::string_view listener_name,
@@ -1887,8 +1898,8 @@ void XdsClient::CancelListenerDataWatch(absl::string_view listener_name,
1887
1898
  listener_state.watchers.erase(it);
1888
1899
  if (listener_state.watchers.empty()) {
1889
1900
  listener_map_.erase(listener_name_str);
1890
- chand_->Unsubscribe(XdsApi::kLdsTypeUrl, listener_name_str,
1891
- delay_unsubscription);
1901
+ chand_->UnsubscribeLocked(XdsApi::kLdsTypeUrl, listener_name_str,
1902
+ delay_unsubscription);
1892
1903
  }
1893
1904
  }
1894
1905
  }
@@ -1912,7 +1923,7 @@ void XdsClient::WatchRouteConfigData(
1912
1923
  }
1913
1924
  w->OnRouteConfigChanged(*route_config_state.update);
1914
1925
  }
1915
- chand_->Subscribe(XdsApi::kRdsTypeUrl, route_config_name_str);
1926
+ chand_->SubscribeLocked(XdsApi::kRdsTypeUrl, route_config_name_str);
1916
1927
  }
1917
1928
 
1918
1929
  void XdsClient::CancelRouteConfigDataWatch(absl::string_view route_config_name,
@@ -1928,8 +1939,8 @@ void XdsClient::CancelRouteConfigDataWatch(absl::string_view route_config_name,
1928
1939
  route_config_state.watchers.erase(it);
1929
1940
  if (route_config_state.watchers.empty()) {
1930
1941
  route_config_map_.erase(route_config_name_str);
1931
- chand_->Unsubscribe(XdsApi::kRdsTypeUrl, route_config_name_str,
1932
- delay_unsubscription);
1942
+ chand_->UnsubscribeLocked(XdsApi::kRdsTypeUrl, route_config_name_str,
1943
+ delay_unsubscription);
1933
1944
  }
1934
1945
  }
1935
1946
  }
@@ -1951,7 +1962,7 @@ void XdsClient::WatchClusterData(
1951
1962
  }
1952
1963
  w->OnClusterChanged(cluster_state.update.value());
1953
1964
  }
1954
- chand_->Subscribe(XdsApi::kCdsTypeUrl, cluster_name_str);
1965
+ chand_->SubscribeLocked(XdsApi::kCdsTypeUrl, cluster_name_str);
1955
1966
  }
1956
1967
 
1957
1968
  void XdsClient::CancelClusterDataWatch(absl::string_view cluster_name,
@@ -1966,8 +1977,8 @@ void XdsClient::CancelClusterDataWatch(absl::string_view cluster_name,
1966
1977
  cluster_state.watchers.erase(it);
1967
1978
  if (cluster_state.watchers.empty()) {
1968
1979
  cluster_map_.erase(cluster_name_str);
1969
- chand_->Unsubscribe(XdsApi::kCdsTypeUrl, cluster_name_str,
1970
- delay_unsubscription);
1980
+ chand_->UnsubscribeLocked(XdsApi::kCdsTypeUrl, cluster_name_str,
1981
+ delay_unsubscription);
1971
1982
  }
1972
1983
  }
1973
1984
  }
@@ -1989,7 +2000,7 @@ void XdsClient::WatchEndpointData(
1989
2000
  }
1990
2001
  w->OnEndpointChanged(endpoint_state.update.value());
1991
2002
  }
1992
- chand_->Subscribe(XdsApi::kEdsTypeUrl, eds_service_name_str);
2003
+ chand_->SubscribeLocked(XdsApi::kEdsTypeUrl, eds_service_name_str);
1993
2004
  }
1994
2005
 
1995
2006
  void XdsClient::CancelEndpointDataWatch(absl::string_view eds_service_name,
@@ -2004,8 +2015,8 @@ void XdsClient::CancelEndpointDataWatch(absl::string_view eds_service_name,
2004
2015
  endpoint_state.watchers.erase(it);
2005
2016
  if (endpoint_state.watchers.empty()) {
2006
2017
  endpoint_map_.erase(eds_service_name_str);
2007
- chand_->Unsubscribe(XdsApi::kEdsTypeUrl, eds_service_name_str,
2008
- delay_unsubscription);
2018
+ chand_->UnsubscribeLocked(XdsApi::kEdsTypeUrl, eds_service_name_str,
2019
+ delay_unsubscription);
2009
2020
  }
2010
2021
  }
2011
2022
  }
@@ -2132,7 +2143,7 @@ void XdsClient::ResetBackoff() {
2132
2143
  }
2133
2144
  }
2134
2145
 
2135
- void XdsClient::NotifyOnErrorLocked(grpc_error* error) {
2146
+ void XdsClient::NotifyOnErrorLocked(grpc_error_handle error) {
2136
2147
  for (const auto& p : listener_map_) {
2137
2148
  const ListenerState& listener_state = p.second;
2138
2149
  for (const auto& p : listener_state.watchers) {
@@ -2241,11 +2252,11 @@ XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshotLocked(
2241
2252
  return snapshot_map;
2242
2253
  }
2243
2254
 
2244
- void XdsClient::UpdateResourceMetadataWithFailedParseResult(
2255
+ void XdsClient::UpdateResourceMetadataWithFailedParseResultLocked(
2245
2256
  grpc_millis update_time, const XdsApi::AdsParseResult& result) {
2246
2257
  // ADS update is rejected and the resource names in the failed update is
2247
2258
  // available.
2248
- absl::string_view details = grpc_error_string(result.parse_error);
2259
+ std::string details = grpc_error_std_string(result.parse_error);
2249
2260
  for (auto& name : result.resource_names_failed) {
2250
2261
  XdsApi::ResourceMetadata* resource_metadata = nullptr;
2251
2262
  if (result.type_url == XdsApi::kLdsTypeUrl) {
@@ -2274,7 +2285,7 @@ void XdsClient::UpdateResourceMetadataWithFailedParseResult(
2274
2285
  }
2275
2286
  resource_metadata->client_status = XdsApi::ResourceMetadata::NACKED;
2276
2287
  resource_metadata->failed_version = result.version;
2277
- resource_metadata->failed_details = std::string(details);
2288
+ resource_metadata->failed_details = details;
2278
2289
  resource_metadata->failed_update_time = update_time;
2279
2290
  }
2280
2291
  }
@@ -2324,24 +2335,105 @@ void XdsClientGlobalInit() {
2324
2335
  XdsHttpFilterRegistry::Init();
2325
2336
  }
2326
2337
 
2327
- void XdsClientGlobalShutdown() {
2328
- delete g_mu;
2329
- g_mu = nullptr;
2338
+ // TODO(roth): Find a better way to clear the fallback config that does
2339
+ // not require using ABSL_NO_THREAD_SAFETY_ANALYSIS.
2340
+ void XdsClientGlobalShutdown() ABSL_NO_THREAD_SAFETY_ANALYSIS {
2330
2341
  gpr_free(g_fallback_bootstrap_config);
2331
2342
  g_fallback_bootstrap_config = nullptr;
2343
+ delete g_mu;
2344
+ g_mu = nullptr;
2332
2345
  XdsHttpFilterRegistry::Shutdown();
2333
2346
  }
2334
2347
 
2335
- RefCountedPtr<XdsClient> XdsClient::GetOrCreate(grpc_error** error) {
2348
+ namespace {
2349
+
2350
+ std::string GetBootstrapContents(const char* fallback_config,
2351
+ grpc_error_handle* error) {
2352
+ // First, try GRPC_XDS_BOOTSTRAP env var.
2353
+ grpc_core::UniquePtr<char> path(gpr_getenv("GRPC_XDS_BOOTSTRAP"));
2354
+ if (path != nullptr) {
2355
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2356
+ gpr_log(GPR_INFO,
2357
+ "Got bootstrap file location from GRPC_XDS_BOOTSTRAP "
2358
+ "environment variable: %s",
2359
+ path.get());
2360
+ }
2361
+ grpc_slice contents;
2362
+ *error =
2363
+ grpc_load_file(path.get(), /*add_null_terminator=*/true, &contents);
2364
+ if (*error != GRPC_ERROR_NONE) return "";
2365
+ std::string contents_str(StringViewFromSlice(contents));
2366
+ grpc_slice_unref_internal(contents);
2367
+ return contents_str;
2368
+ }
2369
+ // Next, try GRPC_XDS_BOOTSTRAP_CONFIG env var.
2370
+ grpc_core::UniquePtr<char> env_config(
2371
+ gpr_getenv("GRPC_XDS_BOOTSTRAP_CONFIG"));
2372
+ if (env_config != nullptr) {
2373
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2374
+ gpr_log(GPR_INFO,
2375
+ "Got bootstrap contents from GRPC_XDS_BOOTSTRAP_CONFIG "
2376
+ "environment variable");
2377
+ }
2378
+ return env_config.get();
2379
+ }
2380
+ // Finally, try fallback config.
2381
+ if (fallback_config != nullptr) {
2382
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2383
+ gpr_log(GPR_INFO, "Got bootstrap contents from fallback config");
2384
+ }
2385
+ return fallback_config;
2386
+ }
2387
+ // No bootstrap config found.
2388
+ *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2389
+ "Environment variables GRPC_XDS_BOOTSTRAP or GRPC_XDS_BOOTSTRAP_CONFIG "
2390
+ "not defined");
2391
+ return "";
2392
+ }
2393
+
2394
+ } // namespace
2395
+
2396
+ RefCountedPtr<XdsClient> XdsClient::GetOrCreate(const grpc_channel_args* args,
2397
+ grpc_error_handle* error) {
2336
2398
  RefCountedPtr<XdsClient> xds_client;
2399
+ // If getting bootstrap from channel args, create a local XdsClient
2400
+ // instance for the channel or server instead of using the global instance.
2401
+ const char* bootstrap_config = grpc_channel_args_find_string(
2402
+ args, GRPC_ARG_TEST_ONLY_DO_NOT_USE_IN_PROD_XDS_BOOTSTRAP_CONFIG);
2403
+ if (bootstrap_config != nullptr) {
2404
+ std::unique_ptr<XdsBootstrap> bootstrap =
2405
+ XdsBootstrap::Create(bootstrap_config, error);
2406
+ if (*error == GRPC_ERROR_NONE) {
2407
+ grpc_channel_args* xds_channel_args =
2408
+ grpc_channel_args_find_pointer<grpc_channel_args>(
2409
+ args,
2410
+ GRPC_ARG_TEST_ONLY_DO_NOT_USE_IN_PROD_XDS_CLIENT_CHANNEL_ARGS);
2411
+ return MakeRefCounted<XdsClient>(std::move(bootstrap), xds_channel_args);
2412
+ }
2413
+ return nullptr;
2414
+ }
2415
+ // Otherwise, use the global instance.
2337
2416
  {
2338
2417
  MutexLock lock(g_mu);
2339
2418
  if (g_xds_client != nullptr) {
2340
2419
  auto xds_client = g_xds_client->RefIfNonZero();
2341
2420
  if (xds_client != nullptr) return xds_client;
2342
2421
  }
2343
- xds_client = MakeRefCounted<XdsClient>(error);
2422
+ // Find bootstrap contents.
2423
+ std::string bootstrap_contents =
2424
+ GetBootstrapContents(g_fallback_bootstrap_config, error);
2344
2425
  if (*error != GRPC_ERROR_NONE) return nullptr;
2426
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2427
+ gpr_log(GPR_INFO, "xDS bootstrap contents: %s",
2428
+ bootstrap_contents.c_str());
2429
+ }
2430
+ // Parse bootstrap.
2431
+ std::unique_ptr<XdsBootstrap> bootstrap =
2432
+ XdsBootstrap::Create(bootstrap_contents, error);
2433
+ if (*error != GRPC_ERROR_NONE) return nullptr;
2434
+ // Instantiate XdsClient.
2435
+ xds_client =
2436
+ MakeRefCounted<XdsClient>(std::move(bootstrap), g_channel_args);
2345
2437
  g_xds_client = xds_client.get();
2346
2438
  }
2347
2439
  return xds_client;
@@ -2367,14 +2459,54 @@ void SetXdsFallbackBootstrapConfig(const char* config) {
2367
2459
 
2368
2460
  } // namespace internal
2369
2461
 
2462
+ //
2463
+ // embedding XdsClient in channel args
2464
+ //
2465
+
2466
+ #define GRPC_ARG_XDS_CLIENT "grpc.internal.xds_client"
2467
+
2468
+ namespace {
2469
+
2470
+ void* XdsClientArgCopy(void* p) {
2471
+ XdsClient* xds_client = static_cast<XdsClient*>(p);
2472
+ xds_client->Ref(DEBUG_LOCATION, "channel arg").release();
2473
+ return p;
2474
+ }
2475
+
2476
+ void XdsClientArgDestroy(void* p) {
2477
+ XdsClient* xds_client = static_cast<XdsClient*>(p);
2478
+ xds_client->Unref(DEBUG_LOCATION, "channel arg");
2479
+ }
2480
+
2481
+ int XdsClientArgCmp(void* p, void* q) { return GPR_ICMP(p, q); }
2482
+
2483
+ const grpc_arg_pointer_vtable kXdsClientArgVtable = {
2484
+ XdsClientArgCopy, XdsClientArgDestroy, XdsClientArgCmp};
2485
+
2486
+ } // namespace
2487
+
2488
+ grpc_arg XdsClient::MakeChannelArg() const {
2489
+ return grpc_channel_arg_pointer_create(const_cast<char*>(GRPC_ARG_XDS_CLIENT),
2490
+ const_cast<XdsClient*>(this),
2491
+ &kXdsClientArgVtable);
2492
+ }
2493
+
2494
+ RefCountedPtr<XdsClient> XdsClient::GetFromChannelArgs(
2495
+ const grpc_channel_args& args) {
2496
+ XdsClient* xds_client =
2497
+ grpc_channel_args_find_pointer<XdsClient>(&args, GRPC_ARG_XDS_CLIENT);
2498
+ if (xds_client == nullptr) return nullptr;
2499
+ return xds_client->Ref(DEBUG_LOCATION, "GetFromChannelArgs");
2500
+ }
2501
+
2370
2502
  } // namespace grpc_core
2371
2503
 
2372
2504
  // The returned bytes may contain NULL(0), so we can't use c-string.
2373
2505
  grpc_slice grpc_dump_xds_configs() {
2374
2506
  grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
2375
2507
  grpc_core::ExecCtx exec_ctx;
2376
- grpc_error* error = GRPC_ERROR_NONE;
2377
- auto xds_client = grpc_core::XdsClient::GetOrCreate(&error);
2508
+ grpc_error_handle error = GRPC_ERROR_NONE;
2509
+ auto xds_client = grpc_core::XdsClient::GetOrCreate(nullptr, &error);
2378
2510
  if (error != GRPC_ERROR_NONE) {
2379
2511
  // If we isn't using xDS, just return an empty string.
2380
2512
  GRPC_ERROR_UNREF(error);