grpc 1.37.1 → 1.40.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 (738) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +112 -59
  3. data/include/grpc/event_engine/README.md +38 -0
  4. data/include/grpc/event_engine/endpoint_config.h +48 -0
  5. data/include/grpc/event_engine/event_engine.h +330 -0
  6. data/include/grpc/event_engine/port.h +41 -0
  7. data/include/grpc/event_engine/slice_allocator.h +66 -0
  8. data/include/grpc/grpc.h +11 -4
  9. data/include/grpc/grpc_security.h +32 -0
  10. data/include/grpc/grpc_security_constants.h +15 -0
  11. data/include/grpc/impl/codegen/grpc_types.h +44 -19
  12. data/include/grpc/impl/codegen/port_platform.h +46 -0
  13. data/include/grpc/module.modulemap +14 -14
  14. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
  15. data/src/core/ext/filters/client_channel/channel_connectivity.cc +177 -202
  16. data/src/core/ext/filters/client_channel/client_channel.cc +975 -3282
  17. data/src/core/ext/filters/client_channel/client_channel.h +513 -55
  18. data/src/core/ext/filters/client_channel/client_channel_channelz.h +1 -1
  19. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -1
  20. data/src/core/ext/filters/client_channel/config_selector.h +20 -7
  21. data/src/core/ext/filters/client_channel/connector.h +1 -1
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +9 -10
  23. data/src/core/ext/filters/client_channel/dynamic_filters.h +3 -3
  24. data/src/core/ext/filters/client_channel/health/health_check_client.cc +28 -27
  25. data/src/core/ext/filters/client_channel/health/health_check_client.h +30 -29
  26. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +24 -21
  27. data/src/core/ext/filters/client_channel/http_proxy.cc +16 -1
  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 +53 -51
  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 +14 -23
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +16 -16
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +734 -0
  35. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +10 -0
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +10 -17
  37. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +1 -1
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +17 -20
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +53 -65
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +36 -44
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +33 -55
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +151 -163
  43. data/src/core/ext/filters/client_channel/lb_policy.cc +2 -16
  44. data/src/core/ext/filters/client_channel/lb_policy.h +70 -46
  45. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -1
  46. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -4
  47. data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -1
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +24 -18
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -1
  50. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_event_engine.cc +31 -0
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +3 -3
  52. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  53. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +14 -14
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +33 -24
  55. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_event_engine.cc +28 -0
  57. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +1 -1
  58. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  59. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +18 -12
  60. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +20 -28
  61. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +7 -5
  62. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +20 -13
  63. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -1
  64. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +158 -102
  65. data/src/core/ext/filters/client_channel/resolver.h +2 -2
  66. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +32 -239
  67. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +20 -49
  68. data/src/core/ext/filters/client_channel/retry_filter.cc +2598 -0
  69. data/src/core/ext/filters/client_channel/retry_filter.h +30 -0
  70. data/src/core/ext/filters/client_channel/retry_service_config.cc +316 -0
  71. data/src/core/ext/filters/client_channel/retry_service_config.h +96 -0
  72. data/src/core/ext/filters/client_channel/server_address.cc +1 -1
  73. data/src/core/ext/filters/client_channel/service_config.cc +15 -14
  74. data/src/core/ext/filters/client_channel/service_config.h +7 -6
  75. data/src/core/ext/filters/client_channel/service_config_call_data.h +45 -5
  76. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +5 -4
  77. data/src/core/ext/filters/client_channel/service_config_parser.cc +6 -6
  78. data/src/core/ext/filters/client_channel/service_config_parser.h +7 -4
  79. data/src/core/ext/filters/client_channel/subchannel.cc +17 -16
  80. data/src/core/ext/filters/client_channel/subchannel.h +7 -6
  81. data/src/core/ext/filters/client_idle/client_idle_filter.cc +17 -16
  82. data/src/core/ext/filters/deadline/deadline_filter.cc +10 -10
  83. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -18
  84. data/src/core/ext/filters/fault_injection/service_config_parser.cc +5 -5
  85. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  86. data/src/core/ext/filters/http/client/http_client_filter.cc +33 -23
  87. data/src/core/ext/filters/http/client_authority_filter.cc +3 -3
  88. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +23 -22
  89. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +21 -21
  90. data/src/core/ext/filters/http/server/http_server_filter.cc +27 -23
  91. data/src/core/ext/filters/max_age/max_age_filter.cc +12 -10
  92. data/src/core/ext/filters/message_size/message_size_filter.cc +14 -11
  93. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  94. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +4 -3
  95. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +7 -7
  96. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +7 -7
  97. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +2 -2
  98. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +3 -2
  99. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +3 -3
  100. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +49 -46
  101. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -2
  102. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +3 -4
  103. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +5 -4
  104. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +3 -4
  105. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +1 -1
  106. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc +66 -0
  107. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h +74 -0
  108. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +141 -126
  109. data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -5
  110. data/src/core/ext/transport/chttp2/transport/context_list.h +4 -4
  111. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  112. data/src/core/ext/transport/chttp2/transport/flow_control.h +9 -9
  113. data/src/core/ext/transport/chttp2/transport/frame_data.cc +12 -12
  114. data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -10
  115. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +15 -16
  116. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +6 -6
  117. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +7 -8
  118. data/src/core/ext/transport/chttp2/transport/frame_ping.h +7 -6
  119. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +7 -7
  120. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +6 -6
  121. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +11 -10
  122. data/src/core/ext/transport/chttp2/transport/frame_settings.h +6 -6
  123. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -6
  124. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +4 -6
  125. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +652 -736
  126. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +195 -74
  127. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +4 -3
  128. data/src/core/ext/transport/chttp2/transport/hpack_table.h +4 -4
  129. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +2 -2
  130. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +2 -2
  131. data/src/core/ext/transport/chttp2/transport/internal.h +33 -28
  132. data/src/core/ext/transport/chttp2/transport/parsing.cc +129 -106
  133. data/src/core/ext/transport/chttp2/transport/varint.cc +6 -4
  134. data/src/core/ext/transport/chttp2/transport/writing.cc +7 -3
  135. data/src/core/ext/transport/inproc/inproc_transport.cc +72 -60
  136. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +56 -35
  137. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +180 -76
  138. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +35 -27
  139. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +97 -48
  140. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +45 -9
  141. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +67 -7
  142. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +66 -9
  143. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +227 -0
  144. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +46 -0
  145. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +121 -0
  146. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +1 -0
  147. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +35 -0
  148. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +90 -0
  149. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +32 -24
  150. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +120 -73
  151. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +4 -2
  152. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +15 -0
  153. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +48 -0
  154. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +171 -0
  155. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +8 -6
  156. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +27 -19
  157. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +1 -0
  158. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +24 -7
  159. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +57 -0
  160. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +29 -17
  161. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +72 -0
  162. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +3 -2
  163. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +4 -0
  164. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +6 -5
  165. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +15 -11
  166. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +85 -43
  167. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +274 -91
  168. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +11 -8
  169. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +30 -13
  170. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +33 -5
  171. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +115 -0
  172. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +60 -0
  173. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +181 -0
  174. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +1 -0
  175. data/src/core/ext/upb-generated/validate/validate.upb.c +82 -66
  176. data/src/core/ext/upb-generated/validate/validate.upb.h +220 -124
  177. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +15 -7
  178. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +53 -52
  179. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +318 -277
  180. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +5 -0
  181. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +437 -410
  182. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +198 -170
  183. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +10 -0
  184. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +9 -8
  185. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +219 -163
  186. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +15 -0
  187. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c +59 -0
  188. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.h +40 -0
  189. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +29 -25
  190. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c +52 -0
  191. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.h +35 -0
  192. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +135 -125
  193. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +5 -0
  194. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +131 -123
  195. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +90 -0
  196. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.h +35 -0
  197. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +32 -24
  198. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +69 -55
  199. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +5 -0
  200. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +684 -664
  201. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +5 -0
  202. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +13 -10
  203. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +13 -10
  204. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +441 -375
  205. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +10 -0
  206. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +122 -114
  207. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +1 -1
  208. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +112 -79
  209. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +5 -0
  210. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c +64 -0
  211. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.h +50 -0
  212. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +35 -32
  213. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +4 -4
  214. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +182 -160
  215. data/src/core/ext/xds/certificate_provider_factory.h +1 -1
  216. data/src/core/ext/xds/certificate_provider_store.h +3 -3
  217. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +3 -3
  218. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +2 -2
  219. data/src/core/ext/xds/xds_api.cc +665 -317
  220. data/src/core/ext/xds/xds_api.h +52 -14
  221. data/src/core/ext/xds/xds_bootstrap.cc +101 -160
  222. data/src/core/ext/xds/xds_bootstrap.h +19 -24
  223. data/src/core/ext/xds/xds_certificate_provider.cc +4 -4
  224. data/src/core/ext/xds/xds_certificate_provider.h +4 -4
  225. data/src/core/ext/xds/xds_channel_args.h +5 -2
  226. data/src/core/ext/xds/xds_client.cc +370 -215
  227. data/src/core/ext/xds/xds_client.h +38 -28
  228. data/src/core/ext/xds/xds_client_stats.h +3 -2
  229. data/src/core/ext/xds/xds_http_filters.cc +3 -2
  230. data/src/core/ext/xds/xds_http_filters.h +3 -0
  231. data/src/core/ext/xds/xds_server_config_fetcher.cc +34 -20
  232. data/src/core/lib/{iomgr → address_utils}/parse_address.cc +17 -17
  233. data/src/core/lib/{iomgr → address_utils}/parse_address.h +7 -7
  234. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.cc +16 -20
  235. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.h +16 -11
  236. data/src/core/lib/channel/call_tracer.h +85 -0
  237. data/src/core/lib/channel/channel_stack.cc +10 -9
  238. data/src/core/lib/channel/channel_stack.h +11 -10
  239. data/src/core/lib/channel/channel_stack_builder.cc +2 -2
  240. data/src/core/lib/channel/channel_stack_builder.h +1 -1
  241. data/src/core/lib/channel/channelz.cc +21 -13
  242. data/src/core/lib/channel/channelz.h +3 -0
  243. data/src/core/lib/channel/connected_channel.cc +4 -4
  244. data/src/core/lib/channel/context.h +3 -0
  245. data/src/core/lib/channel/handshaker.cc +7 -6
  246. data/src/core/lib/channel/handshaker.h +5 -5
  247. data/src/core/lib/channel/status_util.h +4 -0
  248. data/src/core/lib/compression/stream_compression.h +1 -1
  249. data/src/core/lib/compression/stream_compression_gzip.h +1 -1
  250. data/src/core/lib/compression/stream_compression_identity.h +1 -1
  251. data/src/core/lib/debug/stats.h +1 -1
  252. data/src/core/lib/event_engine/endpoint_config.cc +46 -0
  253. data/src/core/lib/event_engine/endpoint_config_internal.h +42 -0
  254. data/src/core/lib/event_engine/event_engine.cc +50 -0
  255. data/src/core/lib/event_engine/sockaddr.cc +40 -0
  256. data/src/core/lib/event_engine/sockaddr.h +44 -0
  257. data/src/core/lib/gpr/murmur_hash.cc +4 -2
  258. data/src/core/lib/gpr/wrap_memcpy.cc +2 -1
  259. data/src/core/lib/gprpp/manual_constructor.h +1 -1
  260. data/src/core/lib/gprpp/orphanable.h +3 -3
  261. data/src/core/lib/gprpp/ref_counted.h +28 -14
  262. data/src/core/lib/gprpp/status_helper.cc +407 -0
  263. data/src/core/lib/gprpp/status_helper.h +183 -0
  264. data/src/core/lib/gprpp/sync.h +2 -30
  265. data/src/core/lib/http/httpcli.cc +11 -11
  266. data/src/core/lib/http/httpcli_security_connector.cc +11 -7
  267. data/src/core/lib/http/parser.cc +16 -16
  268. data/src/core/lib/http/parser.h +4 -4
  269. data/src/core/lib/iomgr/buffer_list.cc +8 -10
  270. data/src/core/lib/iomgr/buffer_list.h +4 -5
  271. data/src/core/lib/iomgr/call_combiner.cc +15 -12
  272. data/src/core/lib/iomgr/call_combiner.h +12 -14
  273. data/src/core/lib/iomgr/cfstream_handle.cc +3 -3
  274. data/src/core/lib/iomgr/cfstream_handle.h +1 -1
  275. data/src/core/lib/iomgr/closure.h +7 -6
  276. data/src/core/lib/iomgr/combiner.cc +14 -12
  277. data/src/core/lib/iomgr/combiner.h +2 -2
  278. data/src/core/lib/iomgr/endpoint.cc +1 -1
  279. data/src/core/lib/iomgr/endpoint.h +2 -2
  280. data/src/core/lib/iomgr/endpoint_cfstream.cc +11 -13
  281. data/src/core/lib/iomgr/endpoint_pair_event_engine.cc +33 -0
  282. data/src/core/lib/iomgr/endpoint_pair_windows.cc +1 -1
  283. data/src/core/lib/iomgr/error.cc +168 -61
  284. data/src/core/lib/iomgr/error.h +217 -106
  285. data/src/core/lib/iomgr/error_cfstream.cc +3 -2
  286. data/src/core/lib/iomgr/error_cfstream.h +2 -2
  287. data/src/core/lib/iomgr/error_internal.h +5 -1
  288. data/src/core/lib/iomgr/ev_apple.cc +5 -5
  289. data/src/core/lib/iomgr/ev_apple.h +1 -1
  290. data/src/core/lib/iomgr/ev_epoll1_linux.cc +19 -19
  291. data/src/core/lib/iomgr/ev_epollex_linux.cc +48 -45
  292. data/src/core/lib/iomgr/ev_poll_posix.cc +26 -23
  293. data/src/core/lib/iomgr/ev_posix.cc +9 -8
  294. data/src/core/lib/iomgr/ev_posix.h +9 -9
  295. data/src/core/lib/iomgr/event_engine/closure.cc +54 -0
  296. data/src/core/lib/iomgr/event_engine/closure.h +33 -0
  297. data/src/core/lib/iomgr/event_engine/endpoint.cc +192 -0
  298. data/src/core/lib/iomgr/event_engine/endpoint.h +53 -0
  299. data/src/core/lib/iomgr/event_engine/iomgr.cc +105 -0
  300. data/src/core/lib/iomgr/event_engine/iomgr.h +24 -0
  301. data/src/core/lib/iomgr/event_engine/pollset.cc +87 -0
  302. data/src/core/lib/iomgr/event_engine/pollset.h +25 -0
  303. data/src/core/lib/iomgr/event_engine/promise.h +51 -0
  304. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +41 -0
  305. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +35 -0
  306. data/src/core/lib/iomgr/event_engine/resolver.cc +110 -0
  307. data/src/core/lib/iomgr/event_engine/tcp.cc +263 -0
  308. data/src/core/lib/iomgr/event_engine/timer.cc +57 -0
  309. data/src/core/lib/iomgr/exec_ctx.cc +12 -4
  310. data/src/core/lib/iomgr/exec_ctx.h +4 -5
  311. data/src/core/lib/iomgr/executor/threadpool.cc +2 -3
  312. data/src/core/lib/iomgr/executor/threadpool.h +2 -2
  313. data/src/core/lib/iomgr/executor.cc +8 -8
  314. data/src/core/lib/iomgr/executor.h +2 -2
  315. data/src/core/lib/iomgr/iomgr.cc +2 -2
  316. data/src/core/lib/iomgr/iomgr.h +1 -1
  317. data/src/core/lib/iomgr/iomgr_custom.cc +1 -1
  318. data/src/core/lib/iomgr/iomgr_internal.cc +2 -2
  319. data/src/core/lib/iomgr/iomgr_internal.h +3 -3
  320. data/src/core/lib/iomgr/iomgr_posix.cc +3 -1
  321. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +42 -12
  322. data/src/core/lib/iomgr/iomgr_windows.cc +1 -1
  323. data/src/core/lib/iomgr/load_file.cc +4 -4
  324. data/src/core/lib/iomgr/load_file.h +2 -2
  325. data/src/core/lib/iomgr/lockfree_event.cc +5 -5
  326. data/src/core/lib/iomgr/lockfree_event.h +1 -1
  327. data/src/core/lib/iomgr/pollset.cc +5 -5
  328. data/src/core/lib/iomgr/pollset.h +9 -9
  329. data/src/core/lib/iomgr/pollset_custom.cc +7 -7
  330. data/src/core/lib/iomgr/pollset_custom.h +3 -1
  331. data/src/core/lib/iomgr/pollset_uv.cc +3 -1
  332. data/src/core/lib/iomgr/pollset_uv.h +5 -1
  333. data/src/core/lib/iomgr/pollset_windows.cc +5 -5
  334. data/src/core/lib/iomgr/port.h +7 -5
  335. data/src/core/lib/iomgr/python_util.h +2 -2
  336. data/src/core/lib/iomgr/resolve_address.cc +8 -4
  337. data/src/core/lib/iomgr/resolve_address.h +12 -6
  338. data/src/core/lib/iomgr/resolve_address_custom.cc +10 -9
  339. data/src/core/lib/iomgr/resolve_address_custom.h +3 -3
  340. data/src/core/lib/iomgr/resolve_address_posix.cc +3 -3
  341. data/src/core/lib/iomgr/resolve_address_windows.cc +4 -4
  342. data/src/core/lib/iomgr/resource_quota.cc +13 -10
  343. data/src/core/lib/iomgr/sockaddr.h +1 -0
  344. data/src/core/lib/iomgr/socket_mutator.cc +15 -2
  345. data/src/core/lib/iomgr/socket_mutator.h +26 -2
  346. data/src/core/lib/iomgr/socket_utils_common_posix.cc +24 -22
  347. data/src/core/lib/iomgr/socket_utils_posix.h +20 -20
  348. data/src/core/lib/iomgr/tcp_client_cfstream.cc +4 -4
  349. data/src/core/lib/iomgr/tcp_client_custom.cc +5 -6
  350. data/src/core/lib/iomgr/tcp_client_posix.cc +22 -19
  351. data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
  352. data/src/core/lib/iomgr/tcp_client_windows.cc +7 -5
  353. data/src/core/lib/iomgr/tcp_custom.cc +14 -16
  354. data/src/core/lib/iomgr/tcp_custom.h +13 -12
  355. data/src/core/lib/iomgr/tcp_posix.cc +78 -73
  356. data/src/core/lib/iomgr/tcp_posix.h +8 -0
  357. data/src/core/lib/iomgr/tcp_server.cc +6 -6
  358. data/src/core/lib/iomgr/tcp_server.h +12 -11
  359. data/src/core/lib/iomgr/tcp_server_custom.cc +26 -25
  360. data/src/core/lib/iomgr/tcp_server_posix.cc +29 -21
  361. data/src/core/lib/iomgr/tcp_server_utils_posix.h +13 -12
  362. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +21 -18
  363. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +9 -9
  364. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +4 -4
  365. data/src/core/lib/iomgr/tcp_server_windows.cc +26 -25
  366. data/src/core/lib/iomgr/tcp_uv.cc +25 -23
  367. data/src/core/lib/iomgr/tcp_windows.cc +13 -13
  368. data/src/core/lib/iomgr/tcp_windows.h +2 -2
  369. data/src/core/lib/iomgr/timer.h +6 -1
  370. data/src/core/lib/iomgr/timer_custom.cc +2 -1
  371. data/src/core/lib/iomgr/timer_custom.h +1 -1
  372. data/src/core/lib/iomgr/timer_generic.cc +6 -6
  373. data/src/core/lib/iomgr/timer_manager.cc +1 -1
  374. data/src/core/lib/iomgr/udp_server.cc +21 -20
  375. data/src/core/lib/iomgr/unix_sockets_posix.cc +3 -3
  376. data/src/core/lib/iomgr/unix_sockets_posix.h +2 -2
  377. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +10 -7
  378. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +3 -3
  379. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +4 -4
  380. data/src/core/lib/iomgr/wakeup_fd_posix.cc +3 -3
  381. data/src/core/lib/iomgr/wakeup_fd_posix.h +8 -6
  382. data/src/core/lib/iomgr/work_serializer.h +17 -1
  383. data/src/core/lib/json/json.h +1 -1
  384. data/src/core/lib/json/json_reader.cc +5 -6
  385. data/src/core/lib/matchers/matchers.cc +46 -58
  386. data/src/core/lib/matchers/matchers.h +30 -29
  387. data/src/core/lib/security/authorization/authorization_engine.h +44 -0
  388. data/src/core/lib/security/authorization/authorization_policy_provider.h +32 -0
  389. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +46 -0
  390. data/src/core/lib/security/authorization/evaluate_args.cc +209 -0
  391. data/src/core/lib/security/authorization/evaluate_args.h +91 -0
  392. data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
  393. data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
  394. data/src/core/lib/security/credentials/credentials.h +2 -2
  395. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +17 -13
  396. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +13 -11
  397. data/src/core/lib/security/credentials/external/aws_request_signer.cc +2 -1
  398. data/src/core/lib/security/credentials/external/aws_request_signer.h +1 -1
  399. data/src/core/lib/security/credentials/external/external_account_credentials.cc +15 -12
  400. data/src/core/lib/security/credentials/external/external_account_credentials.h +9 -8
  401. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +5 -4
  402. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -3
  403. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +8 -8
  404. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +9 -7
  405. data/src/core/lib/security/credentials/fake/fake_credentials.cc +2 -2
  406. data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -2
  407. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +12 -10
  408. data/src/core/lib/security/credentials/iam/iam_credentials.cc +2 -2
  409. data/src/core/lib/security/credentials/iam/iam_credentials.h +2 -2
  410. data/src/core/lib/security/credentials/jwt/json_token.cc +2 -2
  411. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +3 -3
  412. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -2
  413. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +7 -5
  414. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +21 -19
  415. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -5
  416. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +5 -5
  417. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -2
  418. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +8 -7
  419. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -9
  420. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +68 -13
  421. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +7 -0
  422. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -0
  423. data/src/core/lib/security/credentials/tls/tls_utils.cc +32 -0
  424. data/src/core/lib/security/credentials/tls/tls_utils.h +13 -0
  425. data/src/core/lib/security/credentials/xds/xds_credentials.cc +3 -3
  426. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +13 -3
  427. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -3
  428. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  429. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +12 -2
  430. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -1
  431. data/src/core/lib/security/security_connector/local/local_security_connector.cc +22 -9
  432. data/src/core/lib/security/security_connector/security_connector.h +9 -4
  433. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +16 -6
  434. data/src/core/lib/security/security_connector/ssl_utils.cc +27 -4
  435. data/src/core/lib/security/security_connector/ssl_utils.h +4 -4
  436. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +60 -76
  437. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +66 -48
  438. data/src/core/lib/security/transport/client_auth_filter.cc +18 -10
  439. data/src/core/lib/security/transport/secure_endpoint.cc +4 -4
  440. data/src/core/lib/security/transport/security_handshaker.cc +45 -36
  441. data/src/core/lib/security/transport/server_auth_filter.cc +17 -18
  442. data/src/core/lib/security/transport/tsi_error.cc +2 -1
  443. data/src/core/lib/security/transport/tsi_error.h +2 -1
  444. data/src/core/lib/security/util/json_util.cc +2 -2
  445. data/src/core/lib/security/util/json_util.h +1 -1
  446. data/src/core/lib/slice/slice_internal.h +1 -0
  447. data/src/core/lib/surface/call.cc +72 -52
  448. data/src/core/lib/surface/call.h +13 -2
  449. data/src/core/lib/surface/channel.cc +6 -6
  450. data/src/core/lib/surface/channel.h +3 -2
  451. data/src/core/lib/surface/channel_ping.cc +1 -1
  452. data/src/core/lib/surface/completion_queue.cc +68 -69
  453. data/src/core/lib/surface/completion_queue.h +3 -2
  454. data/src/core/lib/surface/completion_queue_factory.cc +1 -2
  455. data/src/core/lib/surface/init.cc +1 -3
  456. data/src/core/lib/surface/init.h +10 -1
  457. data/src/core/lib/surface/lame_client.cc +11 -11
  458. data/src/core/lib/surface/lame_client.h +1 -1
  459. data/src/core/lib/surface/server.cc +31 -23
  460. data/src/core/lib/surface/server.h +19 -18
  461. data/src/core/lib/surface/validate_metadata.cc +7 -7
  462. data/src/core/lib/surface/validate_metadata.h +3 -2
  463. data/src/core/lib/surface/version.cc +2 -2
  464. data/src/core/lib/transport/byte_stream.cc +5 -5
  465. data/src/core/lib/transport/byte_stream.h +8 -8
  466. data/src/core/lib/transport/connectivity_state.cc +1 -1
  467. data/src/core/lib/transport/error_utils.cc +21 -10
  468. data/src/core/lib/transport/error_utils.h +11 -5
  469. data/src/core/lib/transport/metadata_batch.cc +37 -37
  470. data/src/core/lib/transport/metadata_batch.h +19 -18
  471. data/src/core/lib/transport/transport.cc +4 -3
  472. data/src/core/lib/transport/transport.h +6 -4
  473. data/src/core/lib/transport/transport_op_string.cc +6 -6
  474. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -0
  475. data/src/core/tsi/alts/crypt/gsec.h +6 -0
  476. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +5 -4
  477. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +7 -6
  478. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +2 -1
  479. data/src/core/tsi/ssl_transport_security.cc +32 -14
  480. data/src/core/tsi/ssl_transport_security.h +3 -4
  481. data/src/ruby/bin/math_services_pb.rb +1 -1
  482. data/src/ruby/ext/grpc/extconf.rb +2 -0
  483. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +6 -0
  484. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +11 -2
  485. data/src/ruby/lib/grpc/version.rb +1 -1
  486. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +1 -1
  487. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +6 -6
  488. data/third_party/abseil-cpp/absl/algorithm/container.h +3 -3
  489. data/third_party/abseil-cpp/absl/base/attributes.h +24 -4
  490. data/third_party/abseil-cpp/absl/base/call_once.h +2 -9
  491. data/third_party/abseil-cpp/absl/base/config.h +37 -9
  492. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +24 -10
  493. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +4 -1
  494. data/third_party/abseil-cpp/absl/base/internal/endian.h +61 -0
  495. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +2 -3
  496. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +34 -32
  497. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +16 -6
  498. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +11 -2
  499. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +14 -5
  500. data/third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc +2 -2
  501. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +3 -3
  502. data/third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc +2 -2
  503. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +11 -11
  504. data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +5 -5
  505. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +1 -1
  506. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +5 -2
  507. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +43 -42
  508. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +111 -7
  509. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +0 -76
  510. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +1 -3
  511. data/third_party/abseil-cpp/absl/base/log_severity.h +4 -4
  512. data/third_party/abseil-cpp/absl/base/macros.h +11 -0
  513. data/third_party/abseil-cpp/absl/base/optimization.h +10 -7
  514. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  515. data/third_party/abseil-cpp/absl/base/port.h +0 -1
  516. data/third_party/abseil-cpp/absl/base/thread_annotations.h +1 -1
  517. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -2
  518. data/third_party/abseil-cpp/absl/container/inlined_vector.h +5 -3
  519. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +1 -1
  520. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +5 -1
  521. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +2 -1
  522. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +2 -1
  523. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +141 -66
  524. data/third_party/abseil-cpp/absl/container/internal/layout.h +4 -4
  525. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -1
  526. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +136 -136
  527. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +16 -12
  528. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +5 -2
  529. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +3 -12
  530. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +6 -1
  531. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +3 -5
  532. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +2 -2
  533. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +2 -2
  534. data/third_party/abseil-cpp/absl/hash/internal/city.cc +15 -12
  535. data/third_party/abseil-cpp/absl/hash/internal/city.h +1 -19
  536. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +25 -10
  537. data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -37
  538. data/third_party/abseil-cpp/absl/hash/internal/wyhash.cc +111 -0
  539. data/third_party/abseil-cpp/absl/hash/internal/wyhash.h +48 -0
  540. data/third_party/abseil-cpp/absl/meta/type_traits.h +16 -2
  541. data/third_party/abseil-cpp/absl/numeric/bits.h +177 -0
  542. data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -3
  543. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +358 -0
  544. data/third_party/abseil-cpp/absl/numeric/internal/representation.h +55 -0
  545. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +18 -0
  546. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -7
  547. data/third_party/abseil-cpp/absl/status/status.cc +29 -22
  548. data/third_party/abseil-cpp/absl/status/status.h +81 -20
  549. data/third_party/abseil-cpp/absl/status/statusor.h +3 -3
  550. data/third_party/abseil-cpp/absl/strings/charconv.cc +5 -5
  551. data/third_party/abseil-cpp/absl/strings/cord.cc +326 -371
  552. data/third_party/abseil-cpp/absl/strings/cord.h +182 -64
  553. data/third_party/abseil-cpp/absl/strings/escaping.cc +4 -4
  554. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +6 -6
  555. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +83 -0
  556. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +387 -17
  557. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +146 -0
  558. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +897 -0
  559. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +589 -0
  560. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +114 -0
  561. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +14 -0
  562. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -0
  563. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +15 -1
  564. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +19 -4
  565. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +14 -0
  566. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +36 -18
  567. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +14 -0
  568. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +14 -0
  569. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +14 -0
  570. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +15 -40
  571. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +64 -0
  572. data/third_party/abseil-cpp/absl/strings/match.cc +6 -3
  573. data/third_party/abseil-cpp/absl/strings/match.h +16 -6
  574. data/third_party/abseil-cpp/absl/strings/numbers.cc +132 -4
  575. data/third_party/abseil-cpp/absl/strings/numbers.h +10 -10
  576. data/third_party/abseil-cpp/absl/strings/str_join.h +1 -1
  577. data/third_party/abseil-cpp/absl/strings/str_split.h +38 -4
  578. data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +154 -0
  579. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -1
  580. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +2 -2
  581. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +4 -4
  582. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -65
  583. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -6
  584. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +71 -59
  585. data/third_party/abseil-cpp/absl/synchronization/mutex.h +79 -62
  586. data/third_party/abseil-cpp/absl/time/clock.cc +146 -130
  587. data/third_party/abseil-cpp/absl/time/clock.h +2 -2
  588. data/third_party/abseil-cpp/absl/time/duration.cc +3 -2
  589. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +7 -11
  590. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +7 -1
  591. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +4 -4
  592. data/third_party/abseil-cpp/absl/time/time.cc +4 -3
  593. data/third_party/abseil-cpp/absl/time/time.h +26 -24
  594. data/third_party/abseil-cpp/absl/types/internal/variant.h +1 -1
  595. data/third_party/abseil-cpp/absl/types/variant.h +9 -4
  596. data/third_party/boringssl-with-bazel/err_data.c +483 -461
  597. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +1 -1
  598. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +9 -7
  599. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +18 -8
  600. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -2
  601. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +5 -0
  602. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -1
  603. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +1 -1
  604. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c +4 -0
  605. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +1 -88
  606. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +14 -3
  607. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +119 -273
  608. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c +1 -1
  609. data/third_party/boringssl-with-bazel/src/crypto/curve25519/internal.h +1 -1
  610. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +87 -80
  611. data/third_party/boringssl-with-bazel/src/crypto/evp/evp.c +9 -0
  612. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +1 -0
  613. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +1 -1
  614. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/prime.c +0 -4
  615. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +11 -3
  616. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +25 -2
  617. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c +7 -0
  618. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +10 -2
  619. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/md32_common.h +87 -160
  620. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +4 -0
  621. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +0 -1
  622. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +0 -4
  623. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +104 -93
  624. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/internal.h +39 -0
  625. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +52 -65
  626. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +52 -66
  627. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +33 -22
  628. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c +9 -8
  629. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +9 -8
  630. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +17 -13
  631. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +1 -22
  632. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +2 -1
  633. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +1 -4
  634. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +0 -13
  635. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +26 -7
  636. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +26 -24
  637. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +10 -7
  638. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/fips.c +79 -0
  639. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +14 -9
  640. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +61 -75
  641. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +80 -103
  642. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +40 -49
  643. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +367 -315
  644. data/third_party/boringssl-with-bazel/src/crypto/internal.h +65 -0
  645. data/third_party/boringssl-with-bazel/src/crypto/mem.c +14 -0
  646. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +3 -3
  647. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +5 -3
  648. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +95 -48
  649. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c +2 -2
  650. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +1 -1
  651. data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_asn1.c +1 -2
  652. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +0 -28
  653. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +120 -11
  654. data/third_party/boringssl-with-bazel/src/crypto/x509/t_req.c +2 -0
  655. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c +3 -0
  656. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +19 -25
  657. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +3 -2
  658. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +42 -89
  659. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +9 -16
  660. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +2 -0
  661. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +14 -15
  662. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +53 -73
  663. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +31 -0
  664. data/third_party/boringssl-with-bazel/src/crypto/x509/x509rset.c +3 -0
  665. data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +21 -17
  666. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +3 -0
  667. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +7 -25
  668. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +5 -0
  669. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +25 -22
  670. data/third_party/boringssl-with-bazel/src/crypto/x509/x_req.c +5 -8
  671. data/third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c +5 -0
  672. data/third_party/boringssl-with-bazel/src/crypto/x509/x_val.c +2 -0
  673. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +3 -0
  674. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +7 -0
  675. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -4
  676. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
  677. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +1 -0
  678. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +5 -8
  679. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +1 -4
  680. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +66 -1
  681. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +120 -41
  682. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +47 -7
  683. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +1 -0
  684. data/third_party/boringssl-with-bazel/src/include/openssl/chacha.h +1 -1
  685. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +0 -8
  686. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +24 -4
  687. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +6 -2
  688. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +5 -2
  689. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +33 -0
  690. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +3 -2
  691. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +20 -49
  692. data/third_party/boringssl-with-bazel/src/{crypto/x509/x509_r2x.c → include/openssl/evp_errors.h} +41 -58
  693. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +325 -0
  694. data/third_party/boringssl-with-bazel/src/include/openssl/obj.h +24 -5
  695. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +25 -7
  696. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +9 -1
  697. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +2 -2
  698. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +99 -63
  699. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +283 -85
  700. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +13 -19
  701. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +445 -152
  702. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +451 -435
  703. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +2 -1
  704. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +7 -2
  705. data/third_party/boringssl-with-bazel/src/ssl/d1_srtp.cc +1 -1
  706. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +1133 -0
  707. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +298 -22
  708. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +66 -30
  709. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +189 -86
  710. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +154 -24
  711. data/third_party/boringssl-with-bazel/src/ssl/internal.h +414 -135
  712. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +9 -3
  713. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +2 -2
  714. data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +14 -19
  715. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -6
  716. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +23 -26
  717. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +51 -60
  718. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +2 -0
  719. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +8 -31
  720. data/third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc +3 -0
  721. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +4 -3
  722. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +7 -3
  723. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +664 -702
  724. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +65 -7
  725. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +98 -39
  726. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +141 -94
  727. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +213 -118
  728. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +4 -2
  729. data/third_party/xxhash/xxhash.h +77 -195
  730. metadata +116 -51
  731. data/src/core/lib/gpr/arena.h +0 -47
  732. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +0 -88
  733. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +0 -88
  734. data/third_party/abseil-cpp/absl/base/internal/bits.h +0 -219
  735. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +0 -249
  736. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c +0 -29
  737. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +0 -246
  738. data/third_party/boringssl-with-bazel/src/crypto/x509/vpm_int.h +0 -71
@@ -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,44 @@ 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
+ template <typename StateMap>
279
+ void RejectAdsUpdateLocked(grpc_millis update_time,
280
+ const XdsApi::AdsParseResult& result,
281
+ StateMap* state_map)
282
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
283
+
284
+ static void OnRequestSent(void* arg, grpc_error_handle error);
285
+ void OnRequestSentLocked(grpc_error_handle error)
286
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
287
+ static void OnResponseReceived(void* arg, grpc_error_handle error);
288
+ bool OnResponseReceivedLocked()
289
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
290
+ static void OnStatusReceived(void* arg, grpc_error_handle error);
291
+ void OnStatusReceivedLocked(grpc_error_handle error)
292
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
277
293
 
278
294
  bool IsCurrentCallOnChannel() const;
279
295
 
@@ -346,12 +362,15 @@ class XdsClient::ChannelState::LrsCallState
346
362
  void Orphan() override;
347
363
 
348
364
  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);
365
+ void ScheduleNextReportLocked()
366
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
367
+ static void OnNextReportTimer(void* arg, grpc_error_handle error);
368
+ bool OnNextReportTimerLocked(grpc_error_handle error)
369
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
370
+ bool SendReportLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
371
+ static void OnReportDone(void* arg, grpc_error_handle error);
372
+ bool OnReportDoneLocked(grpc_error_handle error)
373
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
355
374
 
356
375
  bool IsCurrentReporterOnCall() const {
357
376
  return this == parent_->reporter_.get();
@@ -370,12 +389,15 @@ class XdsClient::ChannelState::LrsCallState
370
389
  grpc_closure on_report_done_;
371
390
  };
372
391
 
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);
392
+ static void OnInitialRequestSent(void* arg, grpc_error_handle error);
393
+ void OnInitialRequestSentLocked()
394
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
395
+ static void OnResponseReceived(void* arg, grpc_error_handle error);
396
+ bool OnResponseReceivedLocked()
397
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
398
+ static void OnStatusReceived(void* arg, grpc_error_handle error);
399
+ void OnStatusReceivedLocked(grpc_error_handle error)
400
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
379
401
 
380
402
  bool IsCurrentCallOnChannel() const;
381
403
 
@@ -431,7 +453,7 @@ class XdsClient::ChannelState::StateWatcher
431
453
  "[xds_client %p] xds channel in state:TRANSIENT_FAILURE "
432
454
  "status_message:(%s)",
433
455
  parent_->xds_client(), status.ToString().c_str());
434
- parent_->xds_client()->NotifyOnErrorLocked(
456
+ parent_->xds_client_->NotifyOnErrorLocked(
435
457
  GRPC_ERROR_CREATE_FROM_STATIC_STRING(
436
458
  "xds channel in TRANSIENT_FAILURE"));
437
459
  }
@@ -446,26 +468,13 @@ class XdsClient::ChannelState::StateWatcher
446
468
 
447
469
  namespace {
448
470
 
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.
471
+ grpc_channel* CreateXdsChannel(grpc_channel_args* args,
472
+ const XdsBootstrap::XdsServer& server) {
461
473
  RefCountedPtr<grpc_channel_credentials> channel_creds =
462
474
  XdsChannelCredsRegistry::MakeChannelCreds(server.channel_creds_type,
463
475
  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;
476
+ return grpc_secure_channel_create(channel_creds.get(),
477
+ server.server_uri.c_str(), args, nullptr);
469
478
  }
470
479
 
471
480
  } // namespace
@@ -482,7 +491,7 @@ XdsClient::ChannelState::ChannelState(WeakRefCountedPtr<XdsClient> xds_client,
482
491
  gpr_log(GPR_INFO, "[xds_client %p] creating channel to %s",
483
492
  xds_client_.get(), server.server_uri.c_str());
484
493
  }
485
- channel_ = CreateXdsChannel(server);
494
+ channel_ = CreateXdsChannel(xds_client_->args_, server);
486
495
  GPR_ASSERT(channel_ != nullptr);
487
496
  StartConnectivityWatchLocked();
488
497
  }
@@ -527,24 +536,22 @@ void XdsClient::ChannelState::MaybeStartLrsCall() {
527
536
  void XdsClient::ChannelState::StopLrsCall() { lrs_calld_.reset(); }
528
537
 
529
538
  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);
539
+ ClientChannel* client_channel = ClientChannel::GetFromChannel(channel_);
540
+ GPR_ASSERT(client_channel != nullptr);
533
541
  watcher_ = new StateWatcher(Ref(DEBUG_LOCATION, "ChannelState+watch"));
534
- grpc_client_channel_start_connectivity_watch(
535
- client_channel_elem, GRPC_CHANNEL_IDLE,
542
+ client_channel->AddConnectivityWatcher(
543
+ GRPC_CHANNEL_IDLE,
536
544
  OrphanablePtr<AsyncConnectivityStateWatcherInterface>(watcher_));
537
545
  }
538
546
 
539
547
  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_);
548
+ ClientChannel* client_channel = ClientChannel::GetFromChannel(channel_);
549
+ GPR_ASSERT(client_channel != nullptr);
550
+ client_channel->RemoveConnectivityWatcher(watcher_);
544
551
  }
545
552
 
546
- void XdsClient::ChannelState::Subscribe(const std::string& type_url,
547
- const std::string& name) {
553
+ void XdsClient::ChannelState::SubscribeLocked(const std::string& type_url,
554
+ const std::string& name) {
548
555
  if (ads_calld_ == nullptr) {
549
556
  // Start the ADS call if this is the first request.
550
557
  ads_calld_.reset(new RetryableCall<AdsCallState>(
@@ -558,16 +565,16 @@ void XdsClient::ChannelState::Subscribe(const std::string& type_url,
558
565
  // because when the call is restarted it will resend all necessary requests.
559
566
  if (ads_calld() == nullptr) return;
560
567
  // Subscribe to this resource if the ADS call is active.
561
- ads_calld()->Subscribe(type_url, name);
568
+ ads_calld()->SubscribeLocked(type_url, name);
562
569
  }
563
570
 
564
- void XdsClient::ChannelState::Unsubscribe(const std::string& type_url,
565
- const std::string& name,
566
- bool delay_unsubscription) {
571
+ void XdsClient::ChannelState::UnsubscribeLocked(const std::string& type_url,
572
+ const std::string& name,
573
+ bool delay_unsubscription) {
567
574
  if (ads_calld_ != nullptr) {
568
575
  auto* calld = ads_calld_->calld();
569
576
  if (calld != nullptr) {
570
- calld->Unsubscribe(type_url, name, delay_unsubscription);
577
+ calld->UnsubscribeLocked(type_url, name, delay_unsubscription);
571
578
  if (!calld->HasSubscribedResources()) ads_calld_.reset();
572
579
  }
573
580
  }
@@ -650,7 +657,7 @@ void XdsClient::ChannelState::RetryableCall<T>::StartRetryTimerLocked() {
650
657
 
651
658
  template <typename T>
652
659
  void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimer(
653
- void* arg, grpc_error* error) {
660
+ void* arg, grpc_error_handle error) {
654
661
  RetryableCall* calld = static_cast<RetryableCall*>(arg);
655
662
  {
656
663
  MutexLock lock(&calld->chand_->xds_client()->mu_);
@@ -661,7 +668,7 @@ void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimer(
661
668
 
662
669
  template <typename T>
663
670
  void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimerLocked(
664
- grpc_error* error) {
671
+ grpc_error_handle error) {
665
672
  retry_timer_callback_pending_ = false;
666
673
  if (!shutting_down_ && error == GRPC_ERROR_NONE) {
667
674
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
@@ -729,16 +736,16 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
729
736
  GRPC_CLOSURE_INIT(&on_request_sent_, OnRequestSent, this,
730
737
  grpc_schedule_on_exec_ctx);
731
738
  for (const auto& p : xds_client()->listener_map_) {
732
- Subscribe(XdsApi::kLdsTypeUrl, std::string(p.first));
739
+ SubscribeLocked(XdsApi::kLdsTypeUrl, std::string(p.first));
733
740
  }
734
741
  for (const auto& p : xds_client()->route_config_map_) {
735
- Subscribe(XdsApi::kRdsTypeUrl, std::string(p.first));
742
+ SubscribeLocked(XdsApi::kRdsTypeUrl, std::string(p.first));
736
743
  }
737
744
  for (const auto& p : xds_client()->cluster_map_) {
738
- Subscribe(XdsApi::kCdsTypeUrl, std::string(p.first));
745
+ SubscribeLocked(XdsApi::kCdsTypeUrl, std::string(p.first));
739
746
  }
740
747
  for (const auto& p : xds_client()->endpoint_map_) {
741
- Subscribe(XdsApi::kEdsTypeUrl, std::string(p.first));
748
+ SubscribeLocked(XdsApi::kEdsTypeUrl, std::string(p.first));
742
749
  }
743
750
  // Op: recv initial metadata.
744
751
  op = ops;
@@ -802,7 +809,8 @@ void XdsClient::ChannelState::AdsCallState::Orphan() {
802
809
  }
803
810
 
804
811
  void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
805
- const std::string& type_url) {
812
+ const std::string& type_url)
813
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
806
814
  // Buffer message sending if an existing message is in flight.
807
815
  if (send_message_payload_ != nullptr) {
808
816
  buffered_requests_.insert(type_url);
@@ -827,7 +835,7 @@ void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
827
835
  "error=%s resources=%s",
828
836
  xds_client(), type_url.c_str(),
829
837
  xds_client()->resource_version_map_[type_url].c_str(),
830
- state.nonce.c_str(), grpc_error_string(state.error),
838
+ state.nonce.c_str(), grpc_error_std_string(state.error).c_str(),
831
839
  absl::StrJoin(resource_names, " ").c_str());
832
840
  }
833
841
  GRPC_ERROR_UNREF(state.error);
@@ -854,7 +862,7 @@ void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
854
862
  }
855
863
  }
856
864
 
857
- void XdsClient::ChannelState::AdsCallState::Subscribe(
865
+ void XdsClient::ChannelState::AdsCallState::SubscribeLocked(
858
866
  const std::string& type_url, const std::string& name) {
859
867
  auto& state = state_map_[type_url].subscribed_resources[name];
860
868
  if (state == nullptr) {
@@ -864,7 +872,7 @@ void XdsClient::ChannelState::AdsCallState::Subscribe(
864
872
  }
865
873
  }
866
874
 
867
- void XdsClient::ChannelState::AdsCallState::Unsubscribe(
875
+ void XdsClient::ChannelState::AdsCallState::UnsubscribeLocked(
868
876
  const std::string& type_url, const std::string& name,
869
877
  bool delay_unsubscription) {
870
878
  state_map_[type_url].subscribed_resources.erase(name);
@@ -894,7 +902,7 @@ XdsApi::ResourceMetadata CreateResourceMetadataAcked(
894
902
 
895
903
  } // namespace
896
904
 
897
- void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate(
905
+ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdateLocked(
898
906
  std::string version, grpc_millis update_time,
899
907
  XdsApi::LdsUpdateMap lds_update_map) {
900
908
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
@@ -978,7 +986,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate(
978
986
  }
979
987
  }
980
988
 
981
- void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdate(
989
+ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdateLocked(
982
990
  std::string version, grpc_millis update_time,
983
991
  XdsApi::RdsUpdateMap rds_update_map) {
984
992
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
@@ -1020,7 +1028,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdate(
1020
1028
  }
1021
1029
  }
1022
1030
 
1023
- void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdate(
1031
+ void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdateLocked(
1024
1032
  std::string version, grpc_millis update_time,
1025
1033
  XdsApi::CdsUpdateMap cds_update_map) {
1026
1034
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
@@ -1101,7 +1109,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdate(
1101
1109
  }
1102
1110
  }
1103
1111
 
1104
- void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdate(
1112
+ void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdateLocked(
1105
1113
  std::string version, grpc_millis update_time,
1106
1114
  XdsApi::EdsUpdateMap eds_update_map) {
1107
1115
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
@@ -1143,8 +1151,49 @@ void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdate(
1143
1151
  }
1144
1152
  }
1145
1153
 
1146
- void XdsClient::ChannelState::AdsCallState::OnRequestSent(void* arg,
1147
- grpc_error* error) {
1154
+ namespace {
1155
+
1156
+ // Update resource_metadata for NACK.
1157
+ void UpdateResourceMetadataNacked(const std::string& version,
1158
+ const std::string& details,
1159
+ grpc_millis update_time,
1160
+ XdsApi::ResourceMetadata* resource_metadata) {
1161
+ resource_metadata->client_status = XdsApi::ResourceMetadata::NACKED;
1162
+ resource_metadata->failed_version = version;
1163
+ resource_metadata->failed_details = details;
1164
+ resource_metadata->failed_update_time = update_time;
1165
+ }
1166
+
1167
+ } // namespace
1168
+
1169
+ template <typename StateMap>
1170
+ void XdsClient::ChannelState::AdsCallState::RejectAdsUpdateLocked(
1171
+ grpc_millis update_time, const XdsApi::AdsParseResult& result,
1172
+ StateMap* state_map) {
1173
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1174
+ gpr_log(GPR_INFO,
1175
+ "[xds_client %p] %s update NACKed containing %" PRIuPTR
1176
+ " resources",
1177
+ xds_client(), result.type_url.c_str(),
1178
+ result.resource_names_failed.size());
1179
+ }
1180
+ std::string details = grpc_error_std_string(result.parse_error);
1181
+ for (auto& name : result.resource_names_failed) {
1182
+ auto it = state_map->find(name);
1183
+ if (it == state_map->end()) continue;
1184
+ auto& state = it->second;
1185
+ // Notify watchers of error.
1186
+ for (const auto& p : state.watchers) {
1187
+ p.first->OnError(GRPC_ERROR_REF(result.parse_error));
1188
+ }
1189
+ // Update resource metadata for CSDS.
1190
+ UpdateResourceMetadataNacked(result.version, details, update_time,
1191
+ &state.meta);
1192
+ }
1193
+ }
1194
+
1195
+ void XdsClient::ChannelState::AdsCallState::OnRequestSent(
1196
+ void* arg, grpc_error_handle error) {
1148
1197
  AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
1149
1198
  {
1150
1199
  MutexLock lock(&ads_calld->xds_client()->mu_);
@@ -1154,7 +1203,7 @@ void XdsClient::ChannelState::AdsCallState::OnRequestSent(void* arg,
1154
1203
  }
1155
1204
 
1156
1205
  void XdsClient::ChannelState::AdsCallState::OnRequestSentLocked(
1157
- grpc_error* error) {
1206
+ grpc_error_handle error) {
1158
1207
  if (IsCurrentCallOnChannel() && error == GRPC_ERROR_NONE) {
1159
1208
  // Clean up the sent message.
1160
1209
  grpc_byte_buffer_destroy(send_message_payload_);
@@ -1178,7 +1227,7 @@ void XdsClient::ChannelState::AdsCallState::OnRequestSentLocked(
1178
1227
  }
1179
1228
 
1180
1229
  void XdsClient::ChannelState::AdsCallState::OnResponseReceived(
1181
- void* arg, grpc_error* /* error */) {
1230
+ void* arg, grpc_error_handle /* error */) {
1182
1231
  AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
1183
1232
  bool done;
1184
1233
  {
@@ -1212,7 +1261,7 @@ bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1212
1261
  // Ignore unparsable response.
1213
1262
  gpr_log(GPR_ERROR,
1214
1263
  "[xds_client %p] Error parsing ADS response (%s) -- ignoring",
1215
- xds_client(), grpc_error_string(result.parse_error));
1264
+ xds_client(), grpc_error_std_string(result.parse_error).c_str());
1216
1265
  GRPC_ERROR_UNREF(result.parse_error);
1217
1266
  } else {
1218
1267
  grpc_millis update_time = grpc_core::ExecCtx::Get()->Now();
@@ -1221,32 +1270,46 @@ bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1221
1270
  state.nonce = std::move(result.nonce);
1222
1271
  // NACK or ACK the response.
1223
1272
  if (result.parse_error != GRPC_ERROR_NONE) {
1224
- xds_client()->UpdateResourceMetadataWithFailedParseResult(update_time,
1225
- result);
1226
- GRPC_ERROR_UNREF(state.error);
1227
- state.error = result.parse_error;
1228
1273
  // NACK unacceptable update.
1229
1274
  gpr_log(GPR_ERROR,
1230
1275
  "[xds_client %p] ADS response invalid for resource type %s "
1231
1276
  "version %s, will NACK: nonce=%s error=%s",
1232
1277
  xds_client(), result.type_url.c_str(), result.version.c_str(),
1233
- state.nonce.c_str(), grpc_error_string(result.parse_error));
1278
+ state.nonce.c_str(),
1279
+ grpc_error_std_string(result.parse_error).c_str());
1280
+ result.parse_error =
1281
+ grpc_error_set_int(result.parse_error, GRPC_ERROR_INT_GRPC_STATUS,
1282
+ GRPC_STATUS_UNAVAILABLE);
1283
+ GRPC_ERROR_UNREF(state.error);
1284
+ state.error = result.parse_error;
1285
+ if (result.type_url == XdsApi::kLdsTypeUrl) {
1286
+ RejectAdsUpdateLocked(update_time, result,
1287
+ &xds_client()->listener_map_);
1288
+ } else if (result.type_url == XdsApi::kRdsTypeUrl) {
1289
+ RejectAdsUpdateLocked(update_time, result,
1290
+ &xds_client()->route_config_map_);
1291
+ } else if (result.type_url == XdsApi::kCdsTypeUrl) {
1292
+ RejectAdsUpdateLocked(update_time, result, &xds_client()->cluster_map_);
1293
+ } else if (result.type_url == XdsApi::kEdsTypeUrl) {
1294
+ RejectAdsUpdateLocked(update_time, result,
1295
+ &xds_client()->endpoint_map_);
1296
+ }
1234
1297
  SendMessageLocked(result.type_url);
1235
1298
  } else {
1236
1299
  seen_response_ = true;
1237
1300
  // Accept the ADS response according to the type_url.
1238
1301
  if (result.type_url == XdsApi::kLdsTypeUrl) {
1239
- AcceptLdsUpdate(result.version, update_time,
1240
- std::move(result.lds_update_map));
1302
+ AcceptLdsUpdateLocked(result.version, update_time,
1303
+ std::move(result.lds_update_map));
1241
1304
  } else if (result.type_url == XdsApi::kRdsTypeUrl) {
1242
- AcceptRdsUpdate(result.version, update_time,
1243
- std::move(result.rds_update_map));
1305
+ AcceptRdsUpdateLocked(result.version, update_time,
1306
+ std::move(result.rds_update_map));
1244
1307
  } else if (result.type_url == XdsApi::kCdsTypeUrl) {
1245
- AcceptCdsUpdate(result.version, update_time,
1246
- std::move(result.cds_update_map));
1308
+ AcceptCdsUpdateLocked(result.version, update_time,
1309
+ std::move(result.cds_update_map));
1247
1310
  } else if (result.type_url == XdsApi::kEdsTypeUrl) {
1248
- AcceptEdsUpdate(result.version, update_time,
1249
- std::move(result.eds_update_map));
1311
+ AcceptEdsUpdateLocked(result.version, update_time,
1312
+ std::move(result.eds_update_map));
1250
1313
  }
1251
1314
  xds_client()->resource_version_map_[result.type_url] =
1252
1315
  std::move(result.version);
@@ -1277,7 +1340,7 @@ bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1277
1340
  }
1278
1341
 
1279
1342
  void XdsClient::ChannelState::AdsCallState::OnStatusReceived(
1280
- void* arg, grpc_error* error) {
1343
+ void* arg, grpc_error_handle error) {
1281
1344
  AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
1282
1345
  {
1283
1346
  MutexLock lock(&ads_calld->xds_client()->mu_);
@@ -1287,14 +1350,14 @@ void XdsClient::ChannelState::AdsCallState::OnStatusReceived(
1287
1350
  }
1288
1351
 
1289
1352
  void XdsClient::ChannelState::AdsCallState::OnStatusReceivedLocked(
1290
- grpc_error* error) {
1353
+ grpc_error_handle error) {
1291
1354
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1292
1355
  char* status_details = grpc_slice_to_c_string(status_details_);
1293
1356
  gpr_log(GPR_INFO,
1294
1357
  "[xds_client %p] ADS call status received. Status = %d, details "
1295
1358
  "= '%s', (chand: %p, ads_calld: %p, call: %p), error '%s'",
1296
1359
  xds_client(), status_code_, status_details, chand(), this, call_,
1297
- grpc_error_string(error));
1360
+ grpc_error_std_string(error).c_str());
1298
1361
  gpr_free(status_details);
1299
1362
  }
1300
1363
  // Ignore status from a stale call.
@@ -1349,7 +1412,7 @@ void XdsClient::ChannelState::LrsCallState::Reporter::
1349
1412
  }
1350
1413
 
1351
1414
  void XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimer(
1352
- void* arg, grpc_error* error) {
1415
+ void* arg, grpc_error_handle error) {
1353
1416
  Reporter* self = static_cast<Reporter*>(arg);
1354
1417
  bool done;
1355
1418
  {
@@ -1360,7 +1423,7 @@ void XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimer(
1360
1423
  }
1361
1424
 
1362
1425
  bool XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimerLocked(
1363
- grpc_error* error) {
1426
+ grpc_error_handle error) {
1364
1427
  next_report_timer_callback_pending_ = false;
1365
1428
  if (error != GRPC_ERROR_NONE || !IsCurrentReporterOnCall()) {
1366
1429
  GRPC_ERROR_UNREF(error);
@@ -1425,7 +1488,7 @@ bool XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() {
1425
1488
  }
1426
1489
 
1427
1490
  void XdsClient::ChannelState::LrsCallState::Reporter::OnReportDone(
1428
- void* arg, grpc_error* error) {
1491
+ void* arg, grpc_error_handle error) {
1429
1492
  Reporter* self = static_cast<Reporter*>(arg);
1430
1493
  bool done;
1431
1494
  {
@@ -1436,7 +1499,7 @@ void XdsClient::ChannelState::LrsCallState::Reporter::OnReportDone(
1436
1499
  }
1437
1500
 
1438
1501
  bool XdsClient::ChannelState::LrsCallState::Reporter::OnReportDoneLocked(
1439
- grpc_error* error) {
1502
+ grpc_error_handle error) {
1440
1503
  grpc_byte_buffer_destroy(parent_->send_message_payload_);
1441
1504
  parent_->send_message_payload_ = nullptr;
1442
1505
  // If there are no more registered stats to report, cancel the call.
@@ -1606,7 +1669,7 @@ void XdsClient::ChannelState::LrsCallState::MaybeStartReportingLocked() {
1606
1669
  }
1607
1670
 
1608
1671
  void XdsClient::ChannelState::LrsCallState::OnInitialRequestSent(
1609
- void* arg, grpc_error* /*error*/) {
1672
+ void* arg, grpc_error_handle /*error*/) {
1610
1673
  LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
1611
1674
  {
1612
1675
  MutexLock lock(&lrs_calld->xds_client()->mu_);
@@ -1623,7 +1686,7 @@ void XdsClient::ChannelState::LrsCallState::OnInitialRequestSentLocked() {
1623
1686
  }
1624
1687
 
1625
1688
  void XdsClient::ChannelState::LrsCallState::OnResponseReceived(
1626
- void* arg, grpc_error* /*error*/) {
1689
+ void* arg, grpc_error_handle /*error*/) {
1627
1690
  LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
1628
1691
  bool done;
1629
1692
  {
@@ -1651,13 +1714,13 @@ bool XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() {
1651
1714
  bool send_all_clusters = false;
1652
1715
  std::set<std::string> new_cluster_names;
1653
1716
  grpc_millis new_load_reporting_interval;
1654
- grpc_error* parse_error = xds_client()->api_.ParseLrsResponse(
1717
+ grpc_error_handle parse_error = xds_client()->api_.ParseLrsResponse(
1655
1718
  response_slice, &send_all_clusters, &new_cluster_names,
1656
1719
  &new_load_reporting_interval);
1657
1720
  if (parse_error != GRPC_ERROR_NONE) {
1658
1721
  gpr_log(GPR_ERROR,
1659
1722
  "[xds_client %p] LRS response parsing failed. error=%s",
1660
- xds_client(), grpc_error_string(parse_error));
1723
+ xds_client(), grpc_error_std_string(parse_error).c_str());
1661
1724
  GRPC_ERROR_UNREF(parse_error);
1662
1725
  return;
1663
1726
  }
@@ -1726,7 +1789,7 @@ bool XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() {
1726
1789
  }
1727
1790
 
1728
1791
  void XdsClient::ChannelState::LrsCallState::OnStatusReceived(
1729
- void* arg, grpc_error* error) {
1792
+ void* arg, grpc_error_handle error) {
1730
1793
  LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
1731
1794
  {
1732
1795
  MutexLock lock(&lrs_calld->xds_client()->mu_);
@@ -1736,7 +1799,7 @@ void XdsClient::ChannelState::LrsCallState::OnStatusReceived(
1736
1799
  }
1737
1800
 
1738
1801
  void XdsClient::ChannelState::LrsCallState::OnStatusReceivedLocked(
1739
- grpc_error* error) {
1802
+ grpc_error_handle error) {
1740
1803
  GPR_ASSERT(call_ != nullptr);
1741
1804
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1742
1805
  char* status_details = grpc_slice_to_c_string(status_details_);
@@ -1744,7 +1807,7 @@ void XdsClient::ChannelState::LrsCallState::OnStatusReceivedLocked(
1744
1807
  "[xds_client %p] LRS call status received. Status = %d, details "
1745
1808
  "= '%s', (chand: %p, calld: %p, call: %p), error '%s'",
1746
1809
  xds_client(), status_code_, status_details, chand(), this, call_,
1747
- grpc_error_string(error));
1810
+ grpc_error_std_string(error).c_str());
1748
1811
  gpr_free(status_details);
1749
1812
  }
1750
1813
  // Ignore status from a stale call.
@@ -1769,36 +1832,42 @@ bool XdsClient::ChannelState::LrsCallState::IsCurrentCallOnChannel() const {
1769
1832
 
1770
1833
  namespace {
1771
1834
 
1772
- grpc_millis GetRequestTimeout() {
1835
+ grpc_millis GetRequestTimeout(const grpc_channel_args* args) {
1773
1836
  return grpc_channel_args_find_integer(
1774
- g_channel_args, GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS,
1837
+ args, GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS,
1775
1838
  {15000, 0, INT_MAX});
1776
1839
  }
1777
1840
 
1841
+ grpc_channel_args* ModifyChannelArgs(const grpc_channel_args* args) {
1842
+ absl::InlinedVector<grpc_arg, 2> args_to_add = {
1843
+ grpc_channel_arg_integer_create(
1844
+ const_cast<char*>(GRPC_ARG_KEEPALIVE_TIME_MS),
1845
+ 5 * 60 * GPR_MS_PER_SEC),
1846
+ grpc_channel_arg_integer_create(
1847
+ const_cast<char*>(GRPC_ARG_CHANNELZ_IS_INTERNAL_CHANNEL), 1),
1848
+ };
1849
+ return grpc_channel_args_copy_and_add(args, args_to_add.data(),
1850
+ args_to_add.size());
1851
+ }
1852
+
1778
1853
  } // namespace
1779
1854
 
1780
- XdsClient::XdsClient(grpc_error** error)
1855
+ XdsClient::XdsClient(std::unique_ptr<XdsBootstrap> bootstrap,
1856
+ const grpc_channel_args* args)
1781
1857
  : DualRefCounted<XdsClient>(
1782
1858
  GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_refcount_trace) ? "XdsClient"
1783
1859
  : nullptr),
1784
- request_timeout_(GetRequestTimeout()),
1860
+ bootstrap_(std::move(bootstrap)),
1861
+ args_(ModifyChannelArgs(args)),
1862
+ request_timeout_(GetRequestTimeout(args)),
1785
1863
  interested_parties_(grpc_pollset_set_create()),
1786
- bootstrap_(XdsBootstrap::Create(this, &grpc_xds_client_trace,
1787
- g_fallback_bootstrap_config, error)),
1788
1864
  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()) {
1865
+ bootstrap_->certificate_providers())),
1866
+ api_(this, &grpc_xds_client_trace, bootstrap_->node(),
1867
+ &bootstrap_->certificate_providers()) {
1794
1868
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1795
1869
  gpr_log(GPR_INFO, "[xds_client %p] creating xds client", this);
1796
1870
  }
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
1871
  // Create ChannelState object.
1803
1872
  chand_ = MakeOrphanable<ChannelState>(
1804
1873
  WeakRef(DEBUG_LOCATION, "XdsClient+ChannelState"), bootstrap_->server());
@@ -1808,11 +1877,13 @@ XdsClient::~XdsClient() {
1808
1877
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1809
1878
  gpr_log(GPR_INFO, "[xds_client %p] destroying xds client", this);
1810
1879
  }
1880
+ grpc_channel_args_destroy(args_);
1811
1881
  grpc_pollset_set_destroy(interested_parties_);
1812
1882
  }
1813
1883
 
1814
1884
  void XdsClient::AddChannelzLinkage(
1815
1885
  channelz::ChannelNode* parent_channelz_node) {
1886
+ MutexLock lock(&mu_);
1816
1887
  channelz::ChannelNode* xds_channelz_node =
1817
1888
  grpc_channel_get_channelz_node(chand_->channel());
1818
1889
  if (xds_channelz_node != nullptr) {
@@ -1822,6 +1893,7 @@ void XdsClient::AddChannelzLinkage(
1822
1893
 
1823
1894
  void XdsClient::RemoveChannelzLinkage(
1824
1895
  channelz::ChannelNode* parent_channelz_node) {
1896
+ MutexLock lock(&mu_);
1825
1897
  channelz::ChannelNode* xds_channelz_node =
1826
1898
  grpc_channel_get_channelz_node(chand_->channel());
1827
1899
  if (xds_channelz_node != nullptr) {
@@ -1872,7 +1944,7 @@ void XdsClient::WatchListenerData(
1872
1944
  }
1873
1945
  w->OnListenerChanged(*listener_state.update);
1874
1946
  }
1875
- chand_->Subscribe(XdsApi::kLdsTypeUrl, listener_name_str);
1947
+ chand_->SubscribeLocked(XdsApi::kLdsTypeUrl, listener_name_str);
1876
1948
  }
1877
1949
 
1878
1950
  void XdsClient::CancelListenerDataWatch(absl::string_view listener_name,
@@ -1887,8 +1959,8 @@ void XdsClient::CancelListenerDataWatch(absl::string_view listener_name,
1887
1959
  listener_state.watchers.erase(it);
1888
1960
  if (listener_state.watchers.empty()) {
1889
1961
  listener_map_.erase(listener_name_str);
1890
- chand_->Unsubscribe(XdsApi::kLdsTypeUrl, listener_name_str,
1891
- delay_unsubscription);
1962
+ chand_->UnsubscribeLocked(XdsApi::kLdsTypeUrl, listener_name_str,
1963
+ delay_unsubscription);
1892
1964
  }
1893
1965
  }
1894
1966
  }
@@ -1912,7 +1984,7 @@ void XdsClient::WatchRouteConfigData(
1912
1984
  }
1913
1985
  w->OnRouteConfigChanged(*route_config_state.update);
1914
1986
  }
1915
- chand_->Subscribe(XdsApi::kRdsTypeUrl, route_config_name_str);
1987
+ chand_->SubscribeLocked(XdsApi::kRdsTypeUrl, route_config_name_str);
1916
1988
  }
1917
1989
 
1918
1990
  void XdsClient::CancelRouteConfigDataWatch(absl::string_view route_config_name,
@@ -1928,8 +2000,8 @@ void XdsClient::CancelRouteConfigDataWatch(absl::string_view route_config_name,
1928
2000
  route_config_state.watchers.erase(it);
1929
2001
  if (route_config_state.watchers.empty()) {
1930
2002
  route_config_map_.erase(route_config_name_str);
1931
- chand_->Unsubscribe(XdsApi::kRdsTypeUrl, route_config_name_str,
1932
- delay_unsubscription);
2003
+ chand_->UnsubscribeLocked(XdsApi::kRdsTypeUrl, route_config_name_str,
2004
+ delay_unsubscription);
1933
2005
  }
1934
2006
  }
1935
2007
  }
@@ -1951,7 +2023,7 @@ void XdsClient::WatchClusterData(
1951
2023
  }
1952
2024
  w->OnClusterChanged(cluster_state.update.value());
1953
2025
  }
1954
- chand_->Subscribe(XdsApi::kCdsTypeUrl, cluster_name_str);
2026
+ chand_->SubscribeLocked(XdsApi::kCdsTypeUrl, cluster_name_str);
1955
2027
  }
1956
2028
 
1957
2029
  void XdsClient::CancelClusterDataWatch(absl::string_view cluster_name,
@@ -1966,8 +2038,8 @@ void XdsClient::CancelClusterDataWatch(absl::string_view cluster_name,
1966
2038
  cluster_state.watchers.erase(it);
1967
2039
  if (cluster_state.watchers.empty()) {
1968
2040
  cluster_map_.erase(cluster_name_str);
1969
- chand_->Unsubscribe(XdsApi::kCdsTypeUrl, cluster_name_str,
1970
- delay_unsubscription);
2041
+ chand_->UnsubscribeLocked(XdsApi::kCdsTypeUrl, cluster_name_str,
2042
+ delay_unsubscription);
1971
2043
  }
1972
2044
  }
1973
2045
  }
@@ -1989,7 +2061,7 @@ void XdsClient::WatchEndpointData(
1989
2061
  }
1990
2062
  w->OnEndpointChanged(endpoint_state.update.value());
1991
2063
  }
1992
- chand_->Subscribe(XdsApi::kEdsTypeUrl, eds_service_name_str);
2064
+ chand_->SubscribeLocked(XdsApi::kEdsTypeUrl, eds_service_name_str);
1993
2065
  }
1994
2066
 
1995
2067
  void XdsClient::CancelEndpointDataWatch(absl::string_view eds_service_name,
@@ -2004,8 +2076,8 @@ void XdsClient::CancelEndpointDataWatch(absl::string_view eds_service_name,
2004
2076
  endpoint_state.watchers.erase(it);
2005
2077
  if (endpoint_state.watchers.empty()) {
2006
2078
  endpoint_map_.erase(eds_service_name_str);
2007
- chand_->Unsubscribe(XdsApi::kEdsTypeUrl, eds_service_name_str,
2008
- delay_unsubscription);
2079
+ chand_->UnsubscribeLocked(XdsApi::kEdsTypeUrl, eds_service_name_str,
2080
+ delay_unsubscription);
2009
2081
  }
2010
2082
  }
2011
2083
  }
@@ -2132,7 +2204,7 @@ void XdsClient::ResetBackoff() {
2132
2204
  }
2133
2205
  }
2134
2206
 
2135
- void XdsClient::NotifyOnErrorLocked(grpc_error* error) {
2207
+ void XdsClient::NotifyOnErrorLocked(grpc_error_handle error) {
2136
2208
  for (const auto& p : listener_map_) {
2137
2209
  const ListenerState& listener_state = p.second;
2138
2210
  for (const auto& p : listener_state.watchers) {
@@ -2241,44 +2313,6 @@ XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshotLocked(
2241
2313
  return snapshot_map;
2242
2314
  }
2243
2315
 
2244
- void XdsClient::UpdateResourceMetadataWithFailedParseResult(
2245
- grpc_millis update_time, const XdsApi::AdsParseResult& result) {
2246
- // ADS update is rejected and the resource names in the failed update is
2247
- // available.
2248
- absl::string_view details = grpc_error_string(result.parse_error);
2249
- for (auto& name : result.resource_names_failed) {
2250
- XdsApi::ResourceMetadata* resource_metadata = nullptr;
2251
- if (result.type_url == XdsApi::kLdsTypeUrl) {
2252
- auto it = listener_map_.find(name);
2253
- if (it != listener_map_.end()) {
2254
- resource_metadata = &it->second.meta;
2255
- }
2256
- } else if (result.type_url == XdsApi::kRdsTypeUrl) {
2257
- auto it = route_config_map_.find(name);
2258
- if (route_config_map_.find(name) != route_config_map_.end()) {
2259
- resource_metadata = &it->second.meta;
2260
- }
2261
- } else if (result.type_url == XdsApi::kCdsTypeUrl) {
2262
- auto it = cluster_map_.find(name);
2263
- if (cluster_map_.find(name) != cluster_map_.end()) {
2264
- resource_metadata = &it->second.meta;
2265
- }
2266
- } else if (result.type_url == XdsApi::kEdsTypeUrl) {
2267
- auto it = endpoint_map_.find(name);
2268
- if (endpoint_map_.find(name) != endpoint_map_.end()) {
2269
- resource_metadata = &it->second.meta;
2270
- }
2271
- }
2272
- if (resource_metadata == nullptr) {
2273
- return;
2274
- }
2275
- resource_metadata->client_status = XdsApi::ResourceMetadata::NACKED;
2276
- resource_metadata->failed_version = result.version;
2277
- resource_metadata->failed_details = std::string(details);
2278
- resource_metadata->failed_update_time = update_time;
2279
- }
2280
- }
2281
-
2282
2316
  std::string XdsClient::DumpClientConfigBinary() {
2283
2317
  MutexLock lock(&mu_);
2284
2318
  XdsApi::ResourceTypeMetadataMap resource_type_metadata_map;
@@ -2324,24 +2358,105 @@ void XdsClientGlobalInit() {
2324
2358
  XdsHttpFilterRegistry::Init();
2325
2359
  }
2326
2360
 
2327
- void XdsClientGlobalShutdown() {
2328
- delete g_mu;
2329
- g_mu = nullptr;
2361
+ // TODO(roth): Find a better way to clear the fallback config that does
2362
+ // not require using ABSL_NO_THREAD_SAFETY_ANALYSIS.
2363
+ void XdsClientGlobalShutdown() ABSL_NO_THREAD_SAFETY_ANALYSIS {
2330
2364
  gpr_free(g_fallback_bootstrap_config);
2331
2365
  g_fallback_bootstrap_config = nullptr;
2366
+ delete g_mu;
2367
+ g_mu = nullptr;
2332
2368
  XdsHttpFilterRegistry::Shutdown();
2333
2369
  }
2334
2370
 
2335
- RefCountedPtr<XdsClient> XdsClient::GetOrCreate(grpc_error** error) {
2371
+ namespace {
2372
+
2373
+ std::string GetBootstrapContents(const char* fallback_config,
2374
+ grpc_error_handle* error) {
2375
+ // First, try GRPC_XDS_BOOTSTRAP env var.
2376
+ grpc_core::UniquePtr<char> path(gpr_getenv("GRPC_XDS_BOOTSTRAP"));
2377
+ if (path != nullptr) {
2378
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2379
+ gpr_log(GPR_INFO,
2380
+ "Got bootstrap file location from GRPC_XDS_BOOTSTRAP "
2381
+ "environment variable: %s",
2382
+ path.get());
2383
+ }
2384
+ grpc_slice contents;
2385
+ *error =
2386
+ grpc_load_file(path.get(), /*add_null_terminator=*/true, &contents);
2387
+ if (*error != GRPC_ERROR_NONE) return "";
2388
+ std::string contents_str(StringViewFromSlice(contents));
2389
+ grpc_slice_unref_internal(contents);
2390
+ return contents_str;
2391
+ }
2392
+ // Next, try GRPC_XDS_BOOTSTRAP_CONFIG env var.
2393
+ grpc_core::UniquePtr<char> env_config(
2394
+ gpr_getenv("GRPC_XDS_BOOTSTRAP_CONFIG"));
2395
+ if (env_config != nullptr) {
2396
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2397
+ gpr_log(GPR_INFO,
2398
+ "Got bootstrap contents from GRPC_XDS_BOOTSTRAP_CONFIG "
2399
+ "environment variable");
2400
+ }
2401
+ return env_config.get();
2402
+ }
2403
+ // Finally, try fallback config.
2404
+ if (fallback_config != nullptr) {
2405
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2406
+ gpr_log(GPR_INFO, "Got bootstrap contents from fallback config");
2407
+ }
2408
+ return fallback_config;
2409
+ }
2410
+ // No bootstrap config found.
2411
+ *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2412
+ "Environment variables GRPC_XDS_BOOTSTRAP or GRPC_XDS_BOOTSTRAP_CONFIG "
2413
+ "not defined");
2414
+ return "";
2415
+ }
2416
+
2417
+ } // namespace
2418
+
2419
+ RefCountedPtr<XdsClient> XdsClient::GetOrCreate(const grpc_channel_args* args,
2420
+ grpc_error_handle* error) {
2336
2421
  RefCountedPtr<XdsClient> xds_client;
2422
+ // If getting bootstrap from channel args, create a local XdsClient
2423
+ // instance for the channel or server instead of using the global instance.
2424
+ const char* bootstrap_config = grpc_channel_args_find_string(
2425
+ args, GRPC_ARG_TEST_ONLY_DO_NOT_USE_IN_PROD_XDS_BOOTSTRAP_CONFIG);
2426
+ if (bootstrap_config != nullptr) {
2427
+ std::unique_ptr<XdsBootstrap> bootstrap =
2428
+ XdsBootstrap::Create(bootstrap_config, error);
2429
+ if (*error == GRPC_ERROR_NONE) {
2430
+ grpc_channel_args* xds_channel_args =
2431
+ grpc_channel_args_find_pointer<grpc_channel_args>(
2432
+ args,
2433
+ GRPC_ARG_TEST_ONLY_DO_NOT_USE_IN_PROD_XDS_CLIENT_CHANNEL_ARGS);
2434
+ return MakeRefCounted<XdsClient>(std::move(bootstrap), xds_channel_args);
2435
+ }
2436
+ return nullptr;
2437
+ }
2438
+ // Otherwise, use the global instance.
2337
2439
  {
2338
2440
  MutexLock lock(g_mu);
2339
2441
  if (g_xds_client != nullptr) {
2340
2442
  auto xds_client = g_xds_client->RefIfNonZero();
2341
2443
  if (xds_client != nullptr) return xds_client;
2342
2444
  }
2343
- xds_client = MakeRefCounted<XdsClient>(error);
2445
+ // Find bootstrap contents.
2446
+ std::string bootstrap_contents =
2447
+ GetBootstrapContents(g_fallback_bootstrap_config, error);
2344
2448
  if (*error != GRPC_ERROR_NONE) return nullptr;
2449
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2450
+ gpr_log(GPR_INFO, "xDS bootstrap contents: %s",
2451
+ bootstrap_contents.c_str());
2452
+ }
2453
+ // Parse bootstrap.
2454
+ std::unique_ptr<XdsBootstrap> bootstrap =
2455
+ XdsBootstrap::Create(bootstrap_contents, error);
2456
+ if (*error != GRPC_ERROR_NONE) return nullptr;
2457
+ // Instantiate XdsClient.
2458
+ xds_client =
2459
+ MakeRefCounted<XdsClient>(std::move(bootstrap), g_channel_args);
2345
2460
  g_xds_client = xds_client.get();
2346
2461
  }
2347
2462
  return xds_client;
@@ -2367,14 +2482,54 @@ void SetXdsFallbackBootstrapConfig(const char* config) {
2367
2482
 
2368
2483
  } // namespace internal
2369
2484
 
2485
+ //
2486
+ // embedding XdsClient in channel args
2487
+ //
2488
+
2489
+ #define GRPC_ARG_XDS_CLIENT "grpc.internal.xds_client"
2490
+
2491
+ namespace {
2492
+
2493
+ void* XdsClientArgCopy(void* p) {
2494
+ XdsClient* xds_client = static_cast<XdsClient*>(p);
2495
+ xds_client->Ref(DEBUG_LOCATION, "channel arg").release();
2496
+ return p;
2497
+ }
2498
+
2499
+ void XdsClientArgDestroy(void* p) {
2500
+ XdsClient* xds_client = static_cast<XdsClient*>(p);
2501
+ xds_client->Unref(DEBUG_LOCATION, "channel arg");
2502
+ }
2503
+
2504
+ int XdsClientArgCmp(void* p, void* q) { return GPR_ICMP(p, q); }
2505
+
2506
+ const grpc_arg_pointer_vtable kXdsClientArgVtable = {
2507
+ XdsClientArgCopy, XdsClientArgDestroy, XdsClientArgCmp};
2508
+
2509
+ } // namespace
2510
+
2511
+ grpc_arg XdsClient::MakeChannelArg() const {
2512
+ return grpc_channel_arg_pointer_create(const_cast<char*>(GRPC_ARG_XDS_CLIENT),
2513
+ const_cast<XdsClient*>(this),
2514
+ &kXdsClientArgVtable);
2515
+ }
2516
+
2517
+ RefCountedPtr<XdsClient> XdsClient::GetFromChannelArgs(
2518
+ const grpc_channel_args& args) {
2519
+ XdsClient* xds_client =
2520
+ grpc_channel_args_find_pointer<XdsClient>(&args, GRPC_ARG_XDS_CLIENT);
2521
+ if (xds_client == nullptr) return nullptr;
2522
+ return xds_client->Ref(DEBUG_LOCATION, "GetFromChannelArgs");
2523
+ }
2524
+
2370
2525
  } // namespace grpc_core
2371
2526
 
2372
2527
  // The returned bytes may contain NULL(0), so we can't use c-string.
2373
2528
  grpc_slice grpc_dump_xds_configs() {
2374
2529
  grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
2375
2530
  grpc_core::ExecCtx exec_ctx;
2376
- grpc_error* error = GRPC_ERROR_NONE;
2377
- auto xds_client = grpc_core::XdsClient::GetOrCreate(&error);
2531
+ grpc_error_handle error = GRPC_ERROR_NONE;
2532
+ auto xds_client = grpc_core::XdsClient::GetOrCreate(nullptr, &error);
2378
2533
  if (error != GRPC_ERROR_NONE) {
2379
2534
  // If we isn't using xDS, just return an empty string.
2380
2535
  GRPC_ERROR_UNREF(error);