grpc 1.35.0 → 1.38.0.pre1

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

Potentially problematic release.


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

Files changed (885) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +168 -131
  3. data/include/grpc/event_engine/README.md +38 -0
  4. data/include/grpc/event_engine/channel_args.h +28 -0
  5. data/include/grpc/event_engine/event_engine.h +336 -0
  6. data/include/grpc/event_engine/port.h +39 -0
  7. data/include/grpc/event_engine/slice_allocator.h +81 -0
  8. data/include/grpc/grpc.h +15 -1
  9. data/include/grpc/grpc_security.h +16 -11
  10. data/include/grpc/grpc_security_constants.h +14 -0
  11. data/include/grpc/impl/codegen/grpc_types.h +11 -0
  12. data/include/grpc/impl/codegen/port_platform.h +7 -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 +740 -3185
  17. data/src/core/ext/filters/client_channel/client_channel.h +488 -56
  18. data/src/core/ext/filters/client_channel/client_channel_channelz.h +1 -1
  19. data/src/core/ext/filters/client_channel/client_channel_factory.h +2 -1
  20. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -1
  21. data/src/core/ext/filters/client_channel/config_selector.h +10 -2
  22. data/src/core/ext/filters/client_channel/connector.h +1 -1
  23. data/src/core/ext/filters/client_channel/dynamic_filters.cc +18 -14
  24. data/src/core/ext/filters/client_channel/dynamic_filters.h +3 -3
  25. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +24 -142
  26. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +15 -10
  27. data/src/core/ext/filters/client_channel/health/health_check_client.cc +26 -27
  28. data/src/core/ext/filters/client_channel/health/health_check_client.h +27 -26
  29. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +26 -23
  30. data/src/core/ext/filters/client_channel/lb_policy.cc +4 -1
  31. data/src/core/ext/filters/client_channel/lb_policy.h +4 -4
  32. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -6
  33. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +49 -48
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -2
  35. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +2 -3
  36. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -1
  37. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +5 -5
  38. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +22 -18
  39. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +23 -0
  40. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +27 -0
  41. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +4 -4
  42. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +1 -1
  43. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +15 -15
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +318 -193
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +5 -0
  46. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +30 -47
  47. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +32 -47
  48. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +316 -171
  49. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -1
  50. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -4
  51. data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -1
  52. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +27 -67
  53. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +10 -9
  54. data/src/core/ext/filters/client_channel/resolver.cc +5 -5
  55. data/src/core/ext/filters/client_channel/resolver.h +3 -14
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +59 -60
  57. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -1
  58. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +3 -3
  59. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -4
  60. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +17 -15
  61. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +67 -74
  62. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
  63. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +1 -1
  64. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  65. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +33 -23
  66. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +38 -43
  67. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +7 -5
  68. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +379 -0
  69. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +5 -5
  70. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +344 -177
  71. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +32 -239
  72. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +20 -49
  73. data/src/core/ext/filters/client_channel/retry_filter.cc +2188 -0
  74. data/src/core/ext/filters/client_channel/retry_filter.h +30 -0
  75. data/src/core/ext/filters/client_channel/retry_service_config.cc +287 -0
  76. data/src/core/ext/filters/client_channel/retry_service_config.h +90 -0
  77. data/src/core/ext/filters/client_channel/server_address.cc +10 -1
  78. data/src/core/ext/filters/client_channel/server_address.h +31 -0
  79. data/src/core/ext/filters/client_channel/service_config.cc +15 -14
  80. data/src/core/ext/filters/client_channel/service_config.h +7 -6
  81. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +5 -4
  82. data/src/core/ext/filters/client_channel/service_config_parser.cc +6 -6
  83. data/src/core/ext/filters/client_channel/service_config_parser.h +7 -4
  84. data/src/core/ext/filters/client_channel/subchannel.cc +86 -162
  85. data/src/core/ext/filters/client_channel/subchannel.h +68 -99
  86. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +16 -2
  87. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +10 -8
  88. data/src/core/ext/filters/client_idle/client_idle_filter.cc +17 -16
  89. data/src/core/ext/filters/deadline/deadline_filter.cc +10 -10
  90. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +501 -0
  91. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +39 -0
  92. data/src/core/ext/filters/fault_injection/service_config_parser.cc +189 -0
  93. data/src/core/ext/filters/fault_injection/service_config_parser.h +85 -0
  94. data/src/core/ext/filters/http/client/http_client_filter.cc +28 -21
  95. data/src/core/ext/filters/http/client_authority_filter.cc +3 -3
  96. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +23 -22
  97. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +21 -21
  98. data/src/core/ext/filters/http/server/http_server_filter.cc +27 -23
  99. data/src/core/ext/filters/max_age/max_age_filter.cc +47 -42
  100. data/src/core/ext/filters/message_size/message_size_filter.cc +14 -11
  101. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  102. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +5 -4
  103. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +8 -8
  104. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +7 -7
  105. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +5 -4
  106. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +2 -2
  107. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +6 -5
  108. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +507 -196
  109. data/src/core/ext/transport/chttp2/server/chttp2_server.h +11 -2
  110. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +13 -4
  111. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +3 -3
  112. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +64 -21
  113. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +167 -122
  114. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +12 -1
  115. data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -5
  116. data/src/core/ext/transport/chttp2/transport/context_list.h +4 -4
  117. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  118. data/src/core/ext/transport/chttp2/transport/flow_control.h +8 -8
  119. data/src/core/ext/transport/chttp2/transport/frame_data.cc +13 -9
  120. data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -10
  121. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +7 -8
  122. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +6 -6
  123. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +7 -8
  124. data/src/core/ext/transport/chttp2/transport/frame_ping.h +7 -6
  125. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +7 -7
  126. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +6 -6
  127. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -5
  128. data/src/core/ext/transport/chttp2/transport/frame_settings.h +6 -6
  129. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -6
  130. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +4 -6
  131. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +1 -1
  132. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +237 -208
  133. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +10 -10
  134. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +4 -3
  135. data/src/core/ext/transport/chttp2/transport/hpack_table.h +4 -4
  136. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +2 -2
  137. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +2 -2
  138. data/src/core/ext/transport/chttp2/transport/internal.h +32 -27
  139. data/src/core/ext/transport/chttp2/transport/parsing.cc +63 -56
  140. data/src/core/ext/transport/chttp2/transport/writing.cc +7 -3
  141. data/src/core/ext/transport/inproc/inproc_transport.cc +30 -29
  142. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +406 -0
  143. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +1459 -0
  144. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +0 -1
  145. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +350 -0
  146. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +1348 -0
  147. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +11 -16
  148. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +42 -59
  149. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +3 -2
  150. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +15 -0
  151. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +25 -1
  152. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +75 -0
  153. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +2 -2
  154. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +9 -9
  155. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +7 -7
  156. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +28 -13
  157. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +6 -0
  158. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +25 -0
  159. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +0 -1
  160. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +11 -5
  161. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +41 -7
  162. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +0 -1
  163. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +23 -21
  164. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +122 -77
  165. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +13 -9
  166. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +37 -5
  167. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +0 -1
  168. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +144 -0
  169. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +488 -0
  170. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +141 -0
  171. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +452 -0
  172. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +11 -9
  173. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +44 -27
  174. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +57 -16
  175. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +150 -0
  176. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +0 -1
  177. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +29 -0
  178. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +67 -0
  179. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +79 -0
  180. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +268 -0
  181. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +78 -0
  182. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +281 -0
  183. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +41 -0
  184. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +113 -0
  185. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +19 -21
  186. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +64 -51
  187. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +0 -1
  188. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +16 -13
  189. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +50 -18
  190. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +4 -7
  191. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +0 -17
  192. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +0 -1
  193. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +30 -23
  194. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +85 -73
  195. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +0 -3
  196. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +0 -3
  197. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +0 -1
  198. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +0 -2
  199. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +93 -0
  200. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +323 -0
  201. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +36 -0
  202. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +90 -0
  203. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +0 -1
  204. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +46 -0
  205. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +124 -0
  206. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +21 -4
  207. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +29 -0
  208. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.c +33 -0
  209. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +77 -0
  210. data/src/core/ext/upb-generated/{udpa/core/v1 → xds/core/v3}/authority.upb.c +5 -5
  211. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +60 -0
  212. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +52 -0
  213. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +143 -0
  214. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +42 -0
  215. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +84 -0
  216. data/src/core/ext/upb-generated/{udpa/core/v1 → xds/core/v3}/resource.upb.c +9 -9
  217. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +94 -0
  218. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +54 -0
  219. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +166 -0
  220. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +36 -0
  221. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +85 -0
  222. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +354 -0
  223. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +140 -0
  224. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +168 -171
  225. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +383 -0
  226. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +115 -0
  227. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +405 -420
  228. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +2 -2
  229. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +12 -9
  230. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +177 -171
  231. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +10 -0
  232. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +88 -88
  233. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +153 -153
  234. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +10 -7
  235. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +5 -0
  236. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +4 -7
  237. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +33 -20
  238. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +56 -59
  239. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +116 -111
  240. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +129 -121
  241. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +21 -24
  242. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +141 -0
  243. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h +70 -0
  244. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +141 -0
  245. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +70 -0
  246. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +17 -13
  247. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +753 -724
  248. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +10 -0
  249. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +22 -25
  250. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +51 -0
  251. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +35 -0
  252. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +102 -0
  253. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.h +55 -0
  254. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +120 -0
  255. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h +45 -0
  256. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +76 -0
  257. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +35 -0
  258. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +371 -377
  259. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +12 -16
  260. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +112 -108
  261. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +45 -53
  262. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +177 -180
  263. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +92 -102
  264. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +5 -0
  265. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +32 -42
  266. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +30 -40
  267. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +4 -7
  268. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +38 -44
  269. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +130 -0
  270. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +50 -0
  271. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +56 -0
  272. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h +35 -0
  273. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +30 -33
  274. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +63 -0
  275. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.h +40 -0
  276. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +44 -0
  277. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +35 -0
  278. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +14 -11
  279. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +42 -0
  280. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h +35 -0
  281. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +62 -0
  282. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h +40 -0
  283. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +45 -0
  284. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h +40 -0
  285. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +49 -0
  286. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h +35 -0
  287. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +67 -0
  288. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h +40 -0
  289. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +50 -0
  290. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h +35 -0
  291. data/src/core/ext/xds/certificate_provider_factory.h +1 -1
  292. data/src/core/ext/xds/certificate_provider_store.h +3 -3
  293. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +3 -3
  294. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +2 -2
  295. data/src/core/ext/xds/xds_api.cc +2179 -688
  296. data/src/core/ext/xds/xds_api.h +326 -124
  297. data/src/core/ext/xds/xds_bootstrap.cc +115 -142
  298. data/src/core/ext/xds/xds_bootstrap.h +24 -17
  299. data/src/core/ext/xds/xds_certificate_provider.cc +184 -78
  300. data/src/core/ext/xds/xds_certificate_provider.h +84 -45
  301. data/src/core/ext/xds/xds_channel_args.h +5 -2
  302. data/src/core/ext/xds/xds_client.cc +462 -183
  303. data/src/core/ext/xds/xds_client.h +65 -22
  304. data/src/core/ext/xds/xds_client_stats.cc +2 -1
  305. data/src/core/ext/xds/xds_client_stats.h +5 -4
  306. data/src/core/ext/xds/xds_http_fault_filter.cc +226 -0
  307. data/src/core/ext/xds/xds_http_fault_filter.h +63 -0
  308. data/src/core/ext/xds/xds_http_filters.cc +114 -0
  309. data/src/core/ext/xds/xds_http_filters.h +130 -0
  310. data/src/core/ext/xds/xds_server_config_fetcher.cc +444 -29
  311. data/src/core/lib/{iomgr → address_utils}/parse_address.cc +17 -17
  312. data/src/core/lib/{iomgr → address_utils}/parse_address.h +7 -7
  313. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.cc +108 -5
  314. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.h +26 -6
  315. data/src/core/lib/channel/channel_stack.cc +22 -9
  316. data/src/core/lib/channel/channel_stack.h +17 -9
  317. data/src/core/lib/channel/channel_stack_builder.cc +2 -2
  318. data/src/core/lib/channel/channel_stack_builder.h +1 -1
  319. data/src/core/lib/channel/channelz.cc +108 -12
  320. data/src/core/lib/channel/channelz.h +30 -1
  321. data/src/core/lib/channel/channelz_registry.cc +14 -0
  322. data/src/core/lib/channel/connected_channel.cc +4 -4
  323. data/src/core/lib/channel/handshaker.cc +9 -50
  324. data/src/core/lib/channel/handshaker.h +6 -23
  325. data/src/core/lib/channel/status_util.cc +12 -2
  326. data/src/core/lib/channel/status_util.h +5 -0
  327. data/src/core/lib/event_engine/slice_allocator.cc +59 -0
  328. data/src/core/lib/event_engine/sockaddr.cc +38 -0
  329. data/src/core/lib/gpr/log.cc +6 -1
  330. data/src/core/lib/gpr/sync_abseil.cc +3 -6
  331. data/src/core/lib/gpr/sync_windows.cc +2 -2
  332. data/src/core/lib/gprpp/atomic.h +3 -3
  333. data/src/core/lib/gprpp/dual_ref_counted.h +3 -3
  334. data/src/core/lib/gprpp/mpscq.cc +2 -2
  335. data/src/core/lib/gprpp/ref_counted.h +29 -15
  336. data/src/core/lib/gprpp/ref_counted_ptr.h +2 -0
  337. data/src/core/lib/gprpp/status_helper.cc +407 -0
  338. data/src/core/lib/gprpp/status_helper.h +180 -0
  339. data/src/core/lib/gprpp/sync.h +129 -40
  340. data/src/core/lib/gprpp/thd.h +1 -1
  341. data/src/core/lib/gprpp/time_util.cc +77 -0
  342. data/src/core/lib/gprpp/time_util.h +42 -0
  343. data/src/core/lib/http/httpcli.cc +11 -11
  344. data/src/core/lib/http/httpcli_security_connector.cc +13 -9
  345. data/src/core/lib/http/parser.cc +16 -16
  346. data/src/core/lib/http/parser.h +4 -4
  347. data/src/core/lib/iomgr/buffer_list.cc +7 -9
  348. data/src/core/lib/iomgr/buffer_list.h +5 -6
  349. data/src/core/lib/iomgr/call_combiner.cc +15 -12
  350. data/src/core/lib/iomgr/call_combiner.h +12 -14
  351. data/src/core/lib/iomgr/cfstream_handle.cc +5 -5
  352. data/src/core/lib/iomgr/cfstream_handle.h +1 -1
  353. data/src/core/lib/iomgr/closure.h +7 -6
  354. data/src/core/lib/iomgr/combiner.cc +14 -12
  355. data/src/core/lib/iomgr/combiner.h +2 -2
  356. data/src/core/lib/iomgr/endpoint.cc +1 -1
  357. data/src/core/lib/iomgr/endpoint.h +2 -2
  358. data/src/core/lib/iomgr/endpoint_cfstream.cc +11 -13
  359. data/src/core/lib/iomgr/endpoint_pair_windows.cc +1 -1
  360. data/src/core/lib/iomgr/error.cc +167 -61
  361. data/src/core/lib/iomgr/error.h +218 -107
  362. data/src/core/lib/iomgr/error_cfstream.cc +3 -2
  363. data/src/core/lib/iomgr/error_cfstream.h +2 -2
  364. data/src/core/lib/iomgr/error_internal.h +5 -1
  365. data/src/core/lib/iomgr/ev_apple.cc +16 -13
  366. data/src/core/lib/iomgr/ev_epoll1_linux.cc +22 -22
  367. data/src/core/lib/iomgr/ev_epollex_linux.cc +52 -49
  368. data/src/core/lib/iomgr/ev_poll_posix.cc +26 -23
  369. data/src/core/lib/iomgr/ev_posix.cc +12 -11
  370. data/src/core/lib/iomgr/ev_posix.h +9 -9
  371. data/src/core/lib/iomgr/exec_ctx.cc +10 -6
  372. data/src/core/lib/iomgr/exec_ctx.h +1 -1
  373. data/src/core/lib/iomgr/executor.cc +8 -8
  374. data/src/core/lib/iomgr/executor.h +2 -2
  375. data/src/core/lib/iomgr/iomgr.cc +1 -1
  376. data/src/core/lib/iomgr/iomgr.h +1 -1
  377. data/src/core/lib/iomgr/iomgr_custom.cc +1 -1
  378. data/src/core/lib/iomgr/iomgr_internal.cc +2 -2
  379. data/src/core/lib/iomgr/iomgr_internal.h +3 -3
  380. data/src/core/lib/iomgr/iomgr_posix.cc +1 -2
  381. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -3
  382. data/src/core/lib/iomgr/iomgr_windows.cc +1 -1
  383. data/src/core/lib/iomgr/load_file.cc +4 -4
  384. data/src/core/lib/iomgr/load_file.h +2 -2
  385. data/src/core/lib/iomgr/lockfree_event.cc +5 -5
  386. data/src/core/lib/iomgr/lockfree_event.h +1 -1
  387. data/src/core/lib/iomgr/pollset.cc +5 -5
  388. data/src/core/lib/iomgr/pollset.h +9 -9
  389. data/src/core/lib/iomgr/pollset_custom.cc +5 -5
  390. data/src/core/lib/iomgr/pollset_windows.cc +5 -5
  391. data/src/core/lib/iomgr/port.h +1 -1
  392. data/src/core/lib/iomgr/python_util.h +1 -1
  393. data/src/core/lib/iomgr/resolve_address.cc +3 -3
  394. data/src/core/lib/iomgr/resolve_address.h +6 -6
  395. data/src/core/lib/iomgr/resolve_address_custom.cc +10 -9
  396. data/src/core/lib/iomgr/resolve_address_custom.h +3 -3
  397. data/src/core/lib/iomgr/resolve_address_posix.cc +3 -3
  398. data/src/core/lib/iomgr/resolve_address_windows.cc +4 -4
  399. data/src/core/lib/iomgr/resource_quota.cc +12 -11
  400. data/src/core/lib/iomgr/socket_utils_common_posix.cc +23 -20
  401. data/src/core/lib/iomgr/socket_utils_posix.h +20 -20
  402. data/src/core/lib/iomgr/tcp_client_cfstream.cc +4 -4
  403. data/src/core/lib/iomgr/tcp_client_custom.cc +5 -6
  404. data/src/core/lib/iomgr/tcp_client_posix.cc +16 -18
  405. data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
  406. data/src/core/lib/iomgr/tcp_client_windows.cc +5 -5
  407. data/src/core/lib/iomgr/tcp_custom.cc +14 -16
  408. data/src/core/lib/iomgr/tcp_custom.h +13 -12
  409. data/src/core/lib/iomgr/tcp_posix.cc +41 -42
  410. data/src/core/lib/iomgr/tcp_server.cc +6 -6
  411. data/src/core/lib/iomgr/tcp_server.h +12 -11
  412. data/src/core/lib/iomgr/tcp_server_custom.cc +23 -21
  413. data/src/core/lib/iomgr/tcp_server_posix.cc +22 -21
  414. data/src/core/lib/iomgr/tcp_server_utils_posix.h +13 -12
  415. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +19 -17
  416. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +9 -9
  417. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +4 -4
  418. data/src/core/lib/iomgr/tcp_server_windows.cc +26 -25
  419. data/src/core/lib/iomgr/tcp_uv.cc +27 -25
  420. data/src/core/lib/iomgr/tcp_windows.cc +13 -13
  421. data/src/core/lib/iomgr/tcp_windows.h +2 -2
  422. data/src/core/lib/iomgr/timer_custom.cc +2 -1
  423. data/src/core/lib/iomgr/timer_custom.h +1 -1
  424. data/src/core/lib/iomgr/timer_generic.cc +8 -8
  425. data/src/core/lib/iomgr/timer_manager.cc +1 -1
  426. data/src/core/lib/iomgr/udp_server.cc +21 -20
  427. data/src/core/lib/iomgr/unix_sockets_posix.cc +3 -3
  428. data/src/core/lib/iomgr/unix_sockets_posix.h +2 -2
  429. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +10 -7
  430. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +3 -3
  431. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +1 -1
  432. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +4 -4
  433. data/src/core/lib/iomgr/wakeup_fd_posix.cc +3 -3
  434. data/src/core/lib/iomgr/wakeup_fd_posix.h +8 -6
  435. data/src/core/lib/iomgr/work_serializer.h +17 -1
  436. data/src/core/lib/json/json.h +1 -1
  437. data/src/core/lib/json/json_reader.cc +4 -4
  438. data/src/core/lib/matchers/matchers.cc +339 -0
  439. data/src/core/lib/matchers/matchers.h +160 -0
  440. data/src/core/lib/security/credentials/alts/alts_credentials.cc +2 -1
  441. data/src/core/lib/security/credentials/alts/alts_credentials.h +1 -1
  442. data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
  443. data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
  444. data/src/core/lib/security/credentials/credentials.h +4 -3
  445. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +18 -14
  446. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +13 -11
  447. data/src/core/lib/security/credentials/external/aws_request_signer.cc +2 -1
  448. data/src/core/lib/security/credentials/external/aws_request_signer.h +1 -1
  449. data/src/core/lib/security/credentials/external/external_account_credentials.cc +17 -14
  450. data/src/core/lib/security/credentials/external/external_account_credentials.h +9 -8
  451. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +6 -5
  452. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -3
  453. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +9 -9
  454. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +9 -7
  455. data/src/core/lib/security/credentials/fake/fake_credentials.cc +3 -3
  456. data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -2
  457. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +16 -15
  458. data/src/core/lib/security/credentials/iam/iam_credentials.cc +2 -2
  459. data/src/core/lib/security/credentials/iam/iam_credentials.h +2 -2
  460. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +2 -2
  461. data/src/core/lib/security/credentials/jwt/json_token.cc +2 -5
  462. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +3 -3
  463. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -2
  464. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +7 -8
  465. data/src/core/lib/security/credentials/local/local_credentials.cc +2 -1
  466. data/src/core/lib/security/credentials/local/local_credentials.h +1 -1
  467. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +21 -19
  468. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -5
  469. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +5 -5
  470. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -2
  471. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +2 -1
  472. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +1 -1
  473. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +8 -7
  474. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -9
  475. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +19 -13
  476. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -0
  477. data/src/core/lib/security/credentials/tls/tls_credentials.cc +2 -1
  478. data/src/core/lib/security/credentials/tls/tls_credentials.h +1 -1
  479. data/src/core/lib/security/credentials/xds/xds_credentials.cc +130 -61
  480. data/src/core/lib/security/credentials/xds/xds_credentials.h +3 -3
  481. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +13 -3
  482. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -3
  483. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +5 -5
  484. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +12 -2
  485. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -1
  486. data/src/core/lib/security/security_connector/local/local_security_connector.cc +14 -4
  487. data/src/core/lib/security/security_connector/security_connector.h +9 -4
  488. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +16 -6
  489. data/src/core/lib/security/security_connector/ssl_utils.cc +31 -8
  490. data/src/core/lib/security/security_connector/ssl_utils.h +4 -4
  491. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +88 -74
  492. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +66 -48
  493. data/src/core/lib/security/transport/client_auth_filter.cc +18 -10
  494. data/src/core/lib/security/transport/secure_endpoint.cc +4 -4
  495. data/src/core/lib/security/transport/security_handshaker.cc +66 -37
  496. data/src/core/lib/security/transport/server_auth_filter.cc +24 -11
  497. data/src/core/lib/security/transport/tsi_error.cc +2 -1
  498. data/src/core/lib/security/transport/tsi_error.h +2 -1
  499. data/src/core/lib/security/util/json_util.cc +2 -2
  500. data/src/core/lib/security/util/json_util.h +1 -1
  501. data/src/core/lib/slice/slice_intern.cc +5 -6
  502. data/src/core/lib/surface/call.cc +46 -45
  503. data/src/core/lib/surface/call.h +2 -2
  504. data/src/core/lib/surface/channel.cc +6 -6
  505. data/src/core/lib/surface/channel.h +6 -5
  506. data/src/core/lib/surface/channel_ping.cc +1 -1
  507. data/src/core/lib/surface/completion_queue.cc +46 -47
  508. data/src/core/lib/surface/completion_queue.h +2 -1
  509. data/src/core/lib/surface/init.cc +13 -15
  510. data/src/core/lib/surface/lame_client.cc +43 -24
  511. data/src/core/lib/surface/lame_client.h +4 -3
  512. data/src/core/lib/surface/server.cc +71 -58
  513. data/src/core/lib/surface/server.h +91 -28
  514. data/src/core/lib/surface/validate_metadata.cc +7 -7
  515. data/src/core/lib/surface/validate_metadata.h +3 -2
  516. data/src/core/lib/surface/version.cc +4 -2
  517. data/src/core/lib/transport/byte_stream.cc +5 -5
  518. data/src/core/lib/transport/byte_stream.h +8 -8
  519. data/src/core/lib/transport/connectivity_state.cc +1 -1
  520. data/src/core/lib/transport/error_utils.cc +19 -8
  521. data/src/core/lib/transport/error_utils.h +11 -5
  522. data/src/core/lib/transport/metadata.cc +6 -2
  523. data/src/core/lib/transport/metadata_batch.cc +64 -37
  524. data/src/core/lib/transport/metadata_batch.h +33 -18
  525. data/src/core/lib/transport/transport.cc +4 -3
  526. data/src/core/lib/transport/transport.h +4 -4
  527. data/src/core/lib/transport/transport_op_string.cc +5 -5
  528. data/src/core/plugin_registry/grpc_plugin_registry.cc +12 -0
  529. data/src/core/tsi/alts/crypt/gsec.h +4 -0
  530. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +23 -28
  531. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +23 -27
  532. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +1 -1
  533. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +2 -1
  534. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -3
  535. data/src/core/tsi/fake_transport_security.cc +11 -2
  536. data/src/core/tsi/ssl/session_cache/ssl_session.h +0 -3
  537. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +0 -2
  538. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +2 -4
  539. data/src/core/tsi/ssl_transport_security.cc +32 -17
  540. data/src/core/tsi/ssl_transport_security.h +3 -7
  541. data/src/ruby/bin/math_services_pb.rb +1 -1
  542. data/src/ruby/ext/grpc/extconf.rb +9 -1
  543. data/src/ruby/ext/grpc/rb_channel.c +10 -1
  544. data/src/ruby/ext/grpc/rb_channel_credentials.c +11 -1
  545. data/src/ruby/ext/grpc/rb_channel_credentials.h +4 -0
  546. data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
  547. data/src/ruby/ext/grpc/rb_enable_cpp.cc +1 -1
  548. data/src/ruby/ext/grpc/rb_grpc.c +4 -0
  549. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  550. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -1
  551. data/src/ruby/ext/grpc/rb_server.c +13 -1
  552. data/src/ruby/ext/grpc/rb_server_credentials.c +19 -3
  553. data/src/ruby/ext/grpc/rb_server_credentials.h +4 -0
  554. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +215 -0
  555. data/src/ruby/ext/grpc/rb_xds_channel_credentials.h +35 -0
  556. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +169 -0
  557. data/src/ruby/ext/grpc/rb_xds_server_credentials.h +35 -0
  558. data/src/ruby/lib/grpc/generic/client_stub.rb +4 -2
  559. data/src/ruby/lib/grpc/version.rb +1 -1
  560. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +1 -1
  561. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +7 -0
  562. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +6 -6
  563. data/src/ruby/spec/call_spec.rb +1 -1
  564. data/src/ruby/spec/channel_credentials_spec.rb +32 -0
  565. data/src/ruby/spec/channel_spec.rb +17 -6
  566. data/src/ruby/spec/client_auth_spec.rb +27 -1
  567. data/src/ruby/spec/errors_spec.rb +1 -1
  568. data/src/ruby/spec/generic/active_call_spec.rb +2 -2
  569. data/src/ruby/spec/generic/client_stub_spec.rb +4 -4
  570. data/src/ruby/spec/generic/rpc_server_spec.rb +1 -1
  571. data/src/ruby/spec/server_credentials_spec.rb +25 -0
  572. data/src/ruby/spec/server_spec.rb +22 -0
  573. data/third_party/abseil-cpp/absl/algorithm/container.h +3 -3
  574. data/third_party/abseil-cpp/absl/base/attributes.h +24 -4
  575. data/third_party/abseil-cpp/absl/base/call_once.h +2 -9
  576. data/third_party/abseil-cpp/absl/base/config.h +37 -9
  577. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +24 -10
  578. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +4 -1
  579. data/third_party/abseil-cpp/absl/base/internal/endian.h +61 -0
  580. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +2 -3
  581. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +34 -32
  582. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +16 -6
  583. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +11 -2
  584. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +14 -5
  585. data/third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc +2 -2
  586. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +3 -3
  587. data/third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc +2 -2
  588. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +11 -11
  589. data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +5 -5
  590. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +1 -1
  591. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +5 -2
  592. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +43 -42
  593. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +111 -7
  594. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +0 -76
  595. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +1 -3
  596. data/third_party/abseil-cpp/absl/base/log_severity.h +4 -4
  597. data/third_party/abseil-cpp/absl/base/macros.h +11 -0
  598. data/third_party/abseil-cpp/absl/base/optimization.h +10 -7
  599. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  600. data/third_party/abseil-cpp/absl/base/port.h +0 -1
  601. data/third_party/abseil-cpp/absl/base/thread_annotations.h +1 -1
  602. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -2
  603. data/third_party/abseil-cpp/absl/container/inlined_vector.h +5 -3
  604. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +1 -1
  605. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +5 -1
  606. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +2 -1
  607. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +2 -1
  608. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +141 -66
  609. data/third_party/abseil-cpp/absl/container/internal/layout.h +4 -4
  610. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -1
  611. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +136 -136
  612. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +16 -12
  613. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +5 -2
  614. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +3 -12
  615. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +6 -1
  616. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +3 -5
  617. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +2 -2
  618. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +2 -2
  619. data/third_party/abseil-cpp/absl/hash/internal/city.cc +15 -12
  620. data/third_party/abseil-cpp/absl/hash/internal/city.h +1 -19
  621. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +25 -10
  622. data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -37
  623. data/third_party/abseil-cpp/absl/hash/internal/wyhash.cc +111 -0
  624. data/third_party/abseil-cpp/absl/hash/internal/wyhash.h +48 -0
  625. data/third_party/abseil-cpp/absl/meta/type_traits.h +16 -2
  626. data/third_party/abseil-cpp/absl/numeric/bits.h +177 -0
  627. data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -3
  628. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +358 -0
  629. data/third_party/abseil-cpp/absl/numeric/internal/representation.h +55 -0
  630. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +18 -0
  631. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -7
  632. data/third_party/abseil-cpp/absl/status/status.cc +29 -22
  633. data/third_party/abseil-cpp/absl/status/status.h +81 -20
  634. data/third_party/abseil-cpp/absl/status/statusor.h +3 -3
  635. data/third_party/abseil-cpp/absl/strings/charconv.cc +5 -5
  636. data/third_party/abseil-cpp/absl/strings/cord.cc +326 -371
  637. data/third_party/abseil-cpp/absl/strings/cord.h +182 -64
  638. data/third_party/abseil-cpp/absl/strings/escaping.cc +4 -4
  639. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +6 -6
  640. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +83 -0
  641. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +387 -17
  642. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +146 -0
  643. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +897 -0
  644. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +589 -0
  645. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +114 -0
  646. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +14 -0
  647. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -0
  648. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +15 -1
  649. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +19 -4
  650. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +14 -0
  651. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +36 -18
  652. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +14 -0
  653. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +14 -0
  654. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +14 -0
  655. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +15 -40
  656. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +64 -0
  657. data/third_party/abseil-cpp/absl/strings/match.cc +6 -3
  658. data/third_party/abseil-cpp/absl/strings/match.h +16 -6
  659. data/third_party/abseil-cpp/absl/strings/numbers.cc +132 -4
  660. data/third_party/abseil-cpp/absl/strings/numbers.h +10 -10
  661. data/third_party/abseil-cpp/absl/strings/str_join.h +1 -1
  662. data/third_party/abseil-cpp/absl/strings/str_split.h +38 -4
  663. data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +154 -0
  664. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +1 -0
  665. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -1
  666. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +2 -2
  667. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +4 -4
  668. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -65
  669. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -6
  670. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +71 -59
  671. data/third_party/abseil-cpp/absl/synchronization/mutex.h +79 -62
  672. data/third_party/abseil-cpp/absl/time/clock.cc +146 -130
  673. data/third_party/abseil-cpp/absl/time/clock.h +2 -2
  674. data/third_party/abseil-cpp/absl/time/duration.cc +3 -2
  675. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +7 -11
  676. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +7 -1
  677. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +4 -4
  678. data/third_party/abseil-cpp/absl/time/time.cc +4 -3
  679. data/third_party/abseil-cpp/absl/time/time.h +26 -24
  680. data/third_party/abseil-cpp/absl/types/internal/variant.h +1 -1
  681. data/third_party/abseil-cpp/absl/types/variant.h +9 -4
  682. data/third_party/boringssl-with-bazel/err_data.c +742 -724
  683. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +3 -3
  684. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +1 -1
  685. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +2 -2
  686. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +5 -5
  687. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +4 -11
  688. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c +3 -3
  689. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +22 -10
  690. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +2 -2
  691. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +16 -16
  692. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +35 -0
  693. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +28 -79
  694. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +40 -86
  695. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +6 -17
  696. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +10 -61
  697. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +0 -2
  698. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +2 -2
  699. data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +4 -0
  700. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +158 -0
  701. data/third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c +3 -10
  702. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +8 -9
  703. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +60 -45
  704. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c +6 -81
  705. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +1 -88
  706. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +101 -3
  707. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +119 -273
  708. data/third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-win.c +41 -0
  709. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +11 -2
  710. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm.c +3 -3
  711. data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/dh_asn1.c +0 -0
  712. data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/params.c +179 -0
  713. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +25 -0
  714. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c +2 -17
  715. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +87 -80
  716. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +4 -1
  717. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn.c +13 -20
  718. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +2 -3
  719. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +10 -2
  720. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +32 -16
  721. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +25 -2
  722. data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/check.c +0 -0
  723. data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/dh.c +136 -213
  724. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +10 -2
  725. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/md32_common.h +4 -43
  726. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +16 -0
  727. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +9 -2
  728. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +0 -4
  729. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +104 -93
  730. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/internal.h +39 -0
  731. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +43 -46
  732. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +43 -46
  733. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +33 -22
  734. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c +9 -8
  735. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +9 -8
  736. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +17 -13
  737. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +1 -22
  738. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +2 -1
  739. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +28 -0
  740. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +135 -43
  741. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +26 -14
  742. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +51 -32
  743. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/fips.c +79 -0
  744. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +161 -9
  745. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +45 -48
  746. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +38 -43
  747. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +37 -45
  748. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +121 -71
  749. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +71 -41
  750. data/third_party/boringssl-with-bazel/src/crypto/internal.h +65 -0
  751. data/third_party/boringssl-with-bazel/src/crypto/mem.c +14 -0
  752. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +3 -3
  753. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +1 -1
  754. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +95 -48
  755. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +10 -7
  756. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c +13 -11
  757. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c +4 -0
  758. data/third_party/boringssl-with-bazel/src/crypto/{fipsmodule/is_fips.c → rand_extra/passive.c} +16 -11
  759. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +5 -1
  760. data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +7 -13
  761. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +0 -28
  762. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +19 -0
  763. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +5 -1
  764. data/third_party/boringssl-with-bazel/src/crypto/x509/t_req.c +2 -0
  765. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +19 -25
  766. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +4 -31
  767. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +10 -7
  768. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +39 -89
  769. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +17 -24
  770. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +1 -1
  771. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +1 -1
  772. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +29 -23
  773. data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +21 -17
  774. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +21 -34
  775. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +6 -2
  776. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c +2 -2
  777. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +25 -22
  778. data/third_party/boringssl-with-bazel/src/crypto/x509/x_val.c +2 -0
  779. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +39 -4
  780. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +2 -2
  781. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +3 -3
  782. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +11 -10
  783. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -3
  784. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +25 -25
  785. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +4 -6
  786. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +2 -1
  787. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +40 -20
  788. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c +3 -4
  789. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +25 -36
  790. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +1 -1
  791. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
  792. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +7 -6
  793. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +6 -6
  794. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +0 -3
  795. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +3 -3
  796. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +737 -551
  797. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +0 -167
  798. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +19 -5
  799. data/third_party/boringssl-with-bazel/src/include/openssl/blake2.h +62 -0
  800. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +22 -7
  801. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +15 -4
  802. data/third_party/boringssl-with-bazel/src/include/openssl/cpu.h +22 -32
  803. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +24 -4
  804. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +56 -26
  805. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +1 -0
  806. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +20 -2
  807. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +19 -0
  808. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +3 -2
  809. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +13 -40
  810. data/third_party/boringssl-with-bazel/src/{crypto/x509/x509_r2x.c → include/openssl/evp_errors.h} +41 -58
  811. data/third_party/boringssl-with-bazel/src/include/openssl/obj.h +24 -5
  812. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +2 -0
  813. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +9 -1
  814. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +5 -2
  815. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +2 -1
  816. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +239 -37
  817. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +28 -8
  818. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +702 -219
  819. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +141 -36
  820. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +5 -0
  821. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +444 -0
  822. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +244 -1
  823. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +47 -15
  824. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +11 -20
  825. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +159 -13
  826. data/third_party/boringssl-with-bazel/src/ssl/internal.h +253 -58
  827. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +7 -1
  828. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +0 -1
  829. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +7 -8
  830. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -6
  831. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +23 -26
  832. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +90 -25
  833. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +7 -8
  834. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +2 -2
  835. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +5 -7
  836. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +450 -104
  837. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +34 -4
  838. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +2 -2
  839. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +48 -15
  840. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +232 -85
  841. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +4 -2
  842. data/third_party/xxhash/xxhash.h +5443 -0
  843. metadata +167 -88
  844. data/src/core/ext/upb-generated/udpa/core/v1/authority.upb.h +0 -60
  845. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c +0 -52
  846. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h +0 -143
  847. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c +0 -42
  848. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h +0 -84
  849. data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.h +0 -94
  850. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c +0 -54
  851. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h +0 -173
  852. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c +0 -36
  853. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h +0 -92
  854. data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c +0 -42
  855. data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h +0 -35
  856. data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c +0 -62
  857. data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h +0 -40
  858. data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c +0 -45
  859. data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h +0 -40
  860. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c +0 -49
  861. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h +0 -35
  862. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c +0 -68
  863. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h +0 -40
  864. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c +0 -51
  865. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h +0 -35
  866. data/src/core/lib/iomgr/iomgr_posix.h +0 -26
  867. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +0 -88
  868. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +0 -88
  869. data/src/core/lib/security/authorization/authorization_engine.cc +0 -177
  870. data/src/core/lib/security/authorization/authorization_engine.h +0 -84
  871. data/src/core/lib/security/authorization/evaluate_args.cc +0 -148
  872. data/src/core/lib/security/authorization/evaluate_args.h +0 -59
  873. data/src/core/lib/security/authorization/mock_cel/activation.h +0 -57
  874. data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +0 -44
  875. data/src/core/lib/security/authorization/mock_cel/cel_expression.h +0 -69
  876. data/src/core/lib/security/authorization/mock_cel/cel_value.h +0 -97
  877. data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +0 -67
  878. data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +0 -57
  879. data/third_party/abseil-cpp/absl/base/internal/bits.h +0 -219
  880. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +0 -504
  881. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +0 -249
  882. data/third_party/upb/upb/json_decode.c +0 -1443
  883. data/third_party/upb/upb/json_decode.h +0 -23
  884. data/third_party/upb/upb/json_encode.c +0 -713
  885. data/third_party/upb/upb/json_encode.h +0 -36
@@ -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
 
@@ -35,19 +33,22 @@
35
33
  #include "src/core/ext/filters/client_channel/client_channel.h"
36
34
  #include "src/core/ext/filters/client_channel/service_config.h"
37
35
  #include "src/core/ext/xds/xds_api.h"
36
+ #include "src/core/ext/xds/xds_bootstrap.h"
38
37
  #include "src/core/ext/xds/xds_channel_args.h"
39
38
  #include "src/core/ext/xds/xds_client.h"
40
39
  #include "src/core/ext/xds/xds_client_stats.h"
40
+ #include "src/core/ext/xds/xds_http_filters.h"
41
+ #include "src/core/lib/address_utils/sockaddr_utils.h"
41
42
  #include "src/core/lib/backoff/backoff.h"
42
43
  #include "src/core/lib/channel/channel_args.h"
43
44
  #include "src/core/lib/channel/channel_stack.h"
45
+ #include "src/core/lib/gpr/env.h"
44
46
  #include "src/core/lib/gpr/string.h"
45
47
  #include "src/core/lib/gprpp/memory.h"
46
48
  #include "src/core/lib/gprpp/orphanable.h"
47
49
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
48
50
  #include "src/core/lib/gprpp/sync.h"
49
51
  #include "src/core/lib/iomgr/sockaddr.h"
50
- #include "src/core/lib/iomgr/sockaddr_utils.h"
51
52
  #include "src/core/lib/iomgr/timer.h"
52
53
  #include "src/core/lib/slice/slice_internal.h"
53
54
  #include "src/core/lib/slice/slice_string_helpers.h"
@@ -70,8 +71,9 @@ TraceFlag grpc_xds_client_refcount_trace(false, "xds_client_refcount");
70
71
  namespace {
71
72
 
72
73
  Mutex* g_mu = nullptr;
73
- const grpc_channel_args* g_channel_args = nullptr;
74
- XdsClient* g_xds_client = 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;
75
77
 
76
78
  } // namespace
77
79
 
@@ -99,8 +101,8 @@ class XdsClient::ChannelState::RetryableCall
99
101
  private:
100
102
  void StartNewCallLocked();
101
103
  void StartRetryTimerLocked();
102
- static void OnRetryTimer(void* arg, grpc_error* error);
103
- void OnRetryTimerLocked(grpc_error* error);
104
+ static void OnRetryTimer(void* arg, grpc_error_handle error);
105
+ void OnRetryTimerLocked(grpc_error_handle error);
104
106
 
105
107
  // The wrapped xds call that talks to the xds server. It's instantiated
106
108
  // every time we start a new call. It's null during call retry backoff.
@@ -132,9 +134,11 @@ class XdsClient::ChannelState::AdsCallState
132
134
  XdsClient* xds_client() const { return chand()->xds_client(); }
133
135
  bool seen_response() const { return seen_response_; }
134
136
 
135
- void Subscribe(const std::string& type_url, const std::string& name);
136
- void Unsubscribe(const std::string& type_url, const std::string& name,
137
- 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_);
138
142
 
139
143
  bool HasSubscribedResources() const;
140
144
 
@@ -175,7 +179,7 @@ class XdsClient::ChannelState::AdsCallState
175
179
  }
176
180
 
177
181
  private:
178
- static void OnTimer(void* arg, grpc_error* error) {
182
+ static void OnTimer(void* arg, grpc_error_handle error) {
179
183
  ResourceState* self = static_cast<ResourceState*>(arg);
180
184
  {
181
185
  MutexLock lock(&self->ads_calld_->xds_client()->mu_);
@@ -185,36 +189,43 @@ class XdsClient::ChannelState::AdsCallState
185
189
  self->Unref(DEBUG_LOCATION, "timer");
186
190
  }
187
191
 
188
- void OnTimerLocked(grpc_error* error) {
192
+ void OnTimerLocked(grpc_error_handle error)
193
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
189
194
  if (error == GRPC_ERROR_NONE && timer_pending_) {
190
195
  timer_pending_ = false;
191
- grpc_error* watcher_error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
196
+ grpc_error_handle watcher_error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
192
197
  absl::StrFormat(
193
198
  "timeout obtaining resource {type=%s name=%s} from xds server",
194
199
  type_url_, name_)
195
200
  .c_str());
201
+ watcher_error = grpc_error_set_int(
202
+ watcher_error, GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
196
203
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
197
204
  gpr_log(GPR_INFO, "[xds_client %p] %s", ads_calld_->xds_client(),
198
- grpc_error_string(watcher_error));
205
+ grpc_error_std_string(watcher_error).c_str());
199
206
  }
200
207
  if (type_url_ == XdsApi::kLdsTypeUrl) {
201
208
  ListenerState& state = ads_calld_->xds_client()->listener_map_[name_];
209
+ state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
202
210
  for (const auto& p : state.watchers) {
203
211
  p.first->OnError(GRPC_ERROR_REF(watcher_error));
204
212
  }
205
213
  } else if (type_url_ == XdsApi::kRdsTypeUrl) {
206
214
  RouteConfigState& state =
207
215
  ads_calld_->xds_client()->route_config_map_[name_];
216
+ state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
208
217
  for (const auto& p : state.watchers) {
209
218
  p.first->OnError(GRPC_ERROR_REF(watcher_error));
210
219
  }
211
220
  } else if (type_url_ == XdsApi::kCdsTypeUrl) {
212
221
  ClusterState& state = ads_calld_->xds_client()->cluster_map_[name_];
222
+ state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
213
223
  for (const auto& p : state.watchers) {
214
224
  p.first->OnError(GRPC_ERROR_REF(watcher_error));
215
225
  }
216
226
  } else if (type_url_ == XdsApi::kEdsTypeUrl) {
217
227
  EndpointState& state = ads_calld_->xds_client()->endpoint_map_[name_];
228
+ state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
218
229
  for (const auto& p : state.watchers) {
219
230
  p.first->OnError(GRPC_ERROR_REF(watcher_error));
220
231
  }
@@ -241,26 +252,38 @@ class XdsClient::ChannelState::AdsCallState
241
252
 
242
253
  // Nonce and error for this resource type.
243
254
  std::string nonce;
244
- grpc_error* error = GRPC_ERROR_NONE;
255
+ grpc_error_handle error = GRPC_ERROR_NONE;
245
256
 
246
257
  // Subscribed resources of this type.
247
258
  std::map<std::string /* name */, OrphanablePtr<ResourceState>>
248
259
  subscribed_resources;
249
260
  };
250
261
 
251
- void SendMessageLocked(const std::string& type_url);
252
-
253
- void AcceptLdsUpdate(XdsApi::LdsUpdateMap lds_update_map);
254
- void AcceptRdsUpdate(XdsApi::RdsUpdateMap rds_update_map);
255
- void AcceptCdsUpdate(XdsApi::CdsUpdateMap cds_update_map);
256
- void AcceptEdsUpdate(XdsApi::EdsUpdateMap eds_update_map);
257
-
258
- static void OnRequestSent(void* arg, grpc_error* error);
259
- void OnRequestSentLocked(grpc_error* error);
260
- static void OnResponseReceived(void* arg, grpc_error* error);
261
- bool OnResponseReceivedLocked();
262
- static void OnStatusReceived(void* arg, grpc_error* error);
263
- void OnStatusReceivedLocked(grpc_error* error);
262
+ void SendMessageLocked(const std::string& type_url)
263
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
264
+
265
+ void AcceptLdsUpdateLocked(std::string version, grpc_millis update_time,
266
+ XdsApi::LdsUpdateMap lds_update_map)
267
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
268
+ void AcceptRdsUpdateLocked(std::string version, grpc_millis update_time,
269
+ XdsApi::RdsUpdateMap rds_update_map)
270
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
271
+ void AcceptCdsUpdateLocked(std::string version, grpc_millis update_time,
272
+ XdsApi::CdsUpdateMap cds_update_map)
273
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
274
+ void AcceptEdsUpdateLocked(std::string version, grpc_millis update_time,
275
+ XdsApi::EdsUpdateMap eds_update_map)
276
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
277
+
278
+ static void OnRequestSent(void* arg, grpc_error_handle error);
279
+ void OnRequestSentLocked(grpc_error_handle error)
280
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
281
+ static void OnResponseReceived(void* arg, grpc_error_handle error);
282
+ bool OnResponseReceivedLocked()
283
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
284
+ static void OnStatusReceived(void* arg, grpc_error_handle error);
285
+ void OnStatusReceivedLocked(grpc_error_handle error)
286
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
264
287
 
265
288
  bool IsCurrentCallOnChannel() const;
266
289
 
@@ -333,12 +356,15 @@ class XdsClient::ChannelState::LrsCallState
333
356
  void Orphan() override;
334
357
 
335
358
  private:
336
- void ScheduleNextReportLocked();
337
- static void OnNextReportTimer(void* arg, grpc_error* error);
338
- bool OnNextReportTimerLocked(grpc_error* error);
339
- bool SendReportLocked();
340
- static void OnReportDone(void* arg, grpc_error* error);
341
- bool OnReportDoneLocked(grpc_error* error);
359
+ void ScheduleNextReportLocked()
360
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
361
+ static void OnNextReportTimer(void* arg, grpc_error_handle error);
362
+ bool OnNextReportTimerLocked(grpc_error_handle error)
363
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
364
+ bool SendReportLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
365
+ static void OnReportDone(void* arg, grpc_error_handle error);
366
+ bool OnReportDoneLocked(grpc_error_handle error)
367
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
342
368
 
343
369
  bool IsCurrentReporterOnCall() const {
344
370
  return this == parent_->reporter_.get();
@@ -357,12 +383,15 @@ class XdsClient::ChannelState::LrsCallState
357
383
  grpc_closure on_report_done_;
358
384
  };
359
385
 
360
- static void OnInitialRequestSent(void* arg, grpc_error* error);
361
- void OnInitialRequestSentLocked();
362
- static void OnResponseReceived(void* arg, grpc_error* error);
363
- bool OnResponseReceivedLocked();
364
- static void OnStatusReceived(void* arg, grpc_error* error);
365
- void OnStatusReceivedLocked(grpc_error* error);
386
+ static void OnInitialRequestSent(void* arg, grpc_error_handle error);
387
+ void OnInitialRequestSentLocked()
388
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
389
+ static void OnResponseReceived(void* arg, grpc_error_handle error);
390
+ bool OnResponseReceivedLocked()
391
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
392
+ static void OnStatusReceived(void* arg, grpc_error_handle error);
393
+ void OnStatusReceivedLocked(grpc_error_handle error)
394
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
366
395
 
367
396
  bool IsCurrentCallOnChannel() const;
368
397
 
@@ -418,7 +447,7 @@ class XdsClient::ChannelState::StateWatcher
418
447
  "[xds_client %p] xds channel in state:TRANSIENT_FAILURE "
419
448
  "status_message:(%s)",
420
449
  parent_->xds_client(), status.ToString().c_str());
421
- parent_->xds_client()->NotifyOnErrorLocked(
450
+ parent_->xds_client_->NotifyOnErrorLocked(
422
451
  GRPC_ERROR_CREATE_FROM_STATIC_STRING(
423
452
  "xds channel in TRANSIENT_FAILURE"));
424
453
  }
@@ -433,26 +462,13 @@ class XdsClient::ChannelState::StateWatcher
433
462
 
434
463
  namespace {
435
464
 
436
- grpc_channel* CreateXdsChannel(const XdsBootstrap::XdsServer& server) {
437
- // Build channel args.
438
- absl::InlinedVector<grpc_arg, 2> args_to_add = {
439
- grpc_channel_arg_integer_create(
440
- const_cast<char*>(GRPC_ARG_KEEPALIVE_TIME_MS),
441
- 5 * 60 * GPR_MS_PER_SEC),
442
- grpc_channel_arg_integer_create(
443
- const_cast<char*>(GRPC_ARG_CHANNELZ_IS_INTERNAL_CHANNEL), 1),
444
- };
445
- grpc_channel_args* new_args = grpc_channel_args_copy_and_add(
446
- g_channel_args, args_to_add.data(), args_to_add.size());
447
- // Create channel creds.
465
+ grpc_channel* CreateXdsChannel(grpc_channel_args* args,
466
+ const XdsBootstrap::XdsServer& server) {
448
467
  RefCountedPtr<grpc_channel_credentials> channel_creds =
449
468
  XdsChannelCredsRegistry::MakeChannelCreds(server.channel_creds_type,
450
469
  server.channel_creds_config);
451
- // Create channel.
452
- grpc_channel* channel = grpc_secure_channel_create(
453
- channel_creds.get(), server.server_uri.c_str(), new_args, nullptr);
454
- grpc_channel_args_destroy(new_args);
455
- return channel;
470
+ return grpc_secure_channel_create(channel_creds.get(),
471
+ server.server_uri.c_str(), args, nullptr);
456
472
  }
457
473
 
458
474
  } // namespace
@@ -469,7 +485,7 @@ XdsClient::ChannelState::ChannelState(WeakRefCountedPtr<XdsClient> xds_client,
469
485
  gpr_log(GPR_INFO, "[xds_client %p] creating channel to %s",
470
486
  xds_client_.get(), server.server_uri.c_str());
471
487
  }
472
- channel_ = CreateXdsChannel(server);
488
+ channel_ = CreateXdsChannel(xds_client_->args_, server);
473
489
  GPR_ASSERT(channel_ != nullptr);
474
490
  StartConnectivityWatchLocked();
475
491
  }
@@ -502,7 +518,7 @@ XdsClient::ChannelState::LrsCallState* XdsClient::ChannelState::lrs_calld()
502
518
  }
503
519
 
504
520
  bool XdsClient::ChannelState::HasActiveAdsCall() const {
505
- return ads_calld_->calld() != nullptr;
521
+ return ads_calld_ != nullptr && ads_calld_->calld() != nullptr;
506
522
  }
507
523
 
508
524
  void XdsClient::ChannelState::MaybeStartLrsCall() {
@@ -514,24 +530,22 @@ void XdsClient::ChannelState::MaybeStartLrsCall() {
514
530
  void XdsClient::ChannelState::StopLrsCall() { lrs_calld_.reset(); }
515
531
 
516
532
  void XdsClient::ChannelState::StartConnectivityWatchLocked() {
517
- grpc_channel_element* client_channel_elem =
518
- grpc_channel_stack_last_element(grpc_channel_get_channel_stack(channel_));
519
- GPR_ASSERT(client_channel_elem->filter == &grpc_client_channel_filter);
533
+ ClientChannel* client_channel = ClientChannel::GetFromChannel(channel_);
534
+ GPR_ASSERT(client_channel != nullptr);
520
535
  watcher_ = new StateWatcher(Ref(DEBUG_LOCATION, "ChannelState+watch"));
521
- grpc_client_channel_start_connectivity_watch(
522
- client_channel_elem, GRPC_CHANNEL_IDLE,
536
+ client_channel->AddConnectivityWatcher(
537
+ GRPC_CHANNEL_IDLE,
523
538
  OrphanablePtr<AsyncConnectivityStateWatcherInterface>(watcher_));
524
539
  }
525
540
 
526
541
  void XdsClient::ChannelState::CancelConnectivityWatchLocked() {
527
- grpc_channel_element* client_channel_elem =
528
- grpc_channel_stack_last_element(grpc_channel_get_channel_stack(channel_));
529
- GPR_ASSERT(client_channel_elem->filter == &grpc_client_channel_filter);
530
- grpc_client_channel_stop_connectivity_watch(client_channel_elem, watcher_);
542
+ ClientChannel* client_channel = ClientChannel::GetFromChannel(channel_);
543
+ GPR_ASSERT(client_channel != nullptr);
544
+ client_channel->RemoveConnectivityWatcher(watcher_);
531
545
  }
532
546
 
533
- void XdsClient::ChannelState::Subscribe(const std::string& type_url,
534
- const std::string& name) {
547
+ void XdsClient::ChannelState::SubscribeLocked(const std::string& type_url,
548
+ const std::string& name) {
535
549
  if (ads_calld_ == nullptr) {
536
550
  // Start the ADS call if this is the first request.
537
551
  ads_calld_.reset(new RetryableCall<AdsCallState>(
@@ -545,16 +559,16 @@ void XdsClient::ChannelState::Subscribe(const std::string& type_url,
545
559
  // because when the call is restarted it will resend all necessary requests.
546
560
  if (ads_calld() == nullptr) return;
547
561
  // Subscribe to this resource if the ADS call is active.
548
- ads_calld()->Subscribe(type_url, name);
562
+ ads_calld()->SubscribeLocked(type_url, name);
549
563
  }
550
564
 
551
- void XdsClient::ChannelState::Unsubscribe(const std::string& type_url,
552
- const std::string& name,
553
- bool delay_unsubscription) {
565
+ void XdsClient::ChannelState::UnsubscribeLocked(const std::string& type_url,
566
+ const std::string& name,
567
+ bool delay_unsubscription) {
554
568
  if (ads_calld_ != nullptr) {
555
569
  auto* calld = ads_calld_->calld();
556
570
  if (calld != nullptr) {
557
- calld->Unsubscribe(type_url, name, delay_unsubscription);
571
+ calld->UnsubscribeLocked(type_url, name, delay_unsubscription);
558
572
  if (!calld->HasSubscribedResources()) ads_calld_.reset();
559
573
  }
560
574
  }
@@ -637,7 +651,7 @@ void XdsClient::ChannelState::RetryableCall<T>::StartRetryTimerLocked() {
637
651
 
638
652
  template <typename T>
639
653
  void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimer(
640
- void* arg, grpc_error* error) {
654
+ void* arg, grpc_error_handle error) {
641
655
  RetryableCall* calld = static_cast<RetryableCall*>(arg);
642
656
  {
643
657
  MutexLock lock(&calld->chand_->xds_client()->mu_);
@@ -648,7 +662,7 @@ void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimer(
648
662
 
649
663
  template <typename T>
650
664
  void XdsClient::ChannelState::RetryableCall<T>::OnRetryTimerLocked(
651
- grpc_error* error) {
665
+ grpc_error_handle error) {
652
666
  retry_timer_callback_pending_ = false;
653
667
  if (!shutting_down_ && error == GRPC_ERROR_NONE) {
654
668
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
@@ -716,16 +730,16 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
716
730
  GRPC_CLOSURE_INIT(&on_request_sent_, OnRequestSent, this,
717
731
  grpc_schedule_on_exec_ctx);
718
732
  for (const auto& p : xds_client()->listener_map_) {
719
- Subscribe(XdsApi::kLdsTypeUrl, std::string(p.first));
733
+ SubscribeLocked(XdsApi::kLdsTypeUrl, std::string(p.first));
720
734
  }
721
735
  for (const auto& p : xds_client()->route_config_map_) {
722
- Subscribe(XdsApi::kRdsTypeUrl, std::string(p.first));
736
+ SubscribeLocked(XdsApi::kRdsTypeUrl, std::string(p.first));
723
737
  }
724
738
  for (const auto& p : xds_client()->cluster_map_) {
725
- Subscribe(XdsApi::kCdsTypeUrl, std::string(p.first));
739
+ SubscribeLocked(XdsApi::kCdsTypeUrl, std::string(p.first));
726
740
  }
727
741
  for (const auto& p : xds_client()->endpoint_map_) {
728
- Subscribe(XdsApi::kEdsTypeUrl, std::string(p.first));
742
+ SubscribeLocked(XdsApi::kEdsTypeUrl, std::string(p.first));
729
743
  }
730
744
  // Op: recv initial metadata.
731
745
  op = ops;
@@ -789,7 +803,8 @@ void XdsClient::ChannelState::AdsCallState::Orphan() {
789
803
  }
790
804
 
791
805
  void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
792
- const std::string& type_url) {
806
+ const std::string& type_url)
807
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
793
808
  // Buffer message sending if an existing message is in flight.
794
809
  if (send_message_payload_ != nullptr) {
795
810
  buffered_requests_.insert(type_url);
@@ -814,7 +829,7 @@ void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
814
829
  "error=%s resources=%s",
815
830
  xds_client(), type_url.c_str(),
816
831
  xds_client()->resource_version_map_[type_url].c_str(),
817
- state.nonce.c_str(), grpc_error_string(state.error),
832
+ state.nonce.c_str(), grpc_error_std_string(state.error).c_str(),
818
833
  absl::StrJoin(resource_names, " ").c_str());
819
834
  }
820
835
  GRPC_ERROR_UNREF(state.error);
@@ -841,7 +856,7 @@ void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
841
856
  }
842
857
  }
843
858
 
844
- void XdsClient::ChannelState::AdsCallState::Subscribe(
859
+ void XdsClient::ChannelState::AdsCallState::SubscribeLocked(
845
860
  const std::string& type_url, const std::string& name) {
846
861
  auto& state = state_map_[type_url].subscribed_resources[name];
847
862
  if (state == nullptr) {
@@ -851,7 +866,7 @@ void XdsClient::ChannelState::AdsCallState::Subscribe(
851
866
  }
852
867
  }
853
868
 
854
- void XdsClient::ChannelState::AdsCallState::Unsubscribe(
869
+ void XdsClient::ChannelState::AdsCallState::UnsubscribeLocked(
855
870
  const std::string& type_url, const std::string& name,
856
871
  bool delay_unsubscription) {
857
872
  state_map_[type_url].subscribed_resources.erase(name);
@@ -865,7 +880,24 @@ bool XdsClient::ChannelState::AdsCallState::HasSubscribedResources() const {
865
880
  return false;
866
881
  }
867
882
 
868
- void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate(
883
+ namespace {
884
+
885
+ // Build a resource metadata struct for ADS result accepting methods and CSDS.
886
+ XdsApi::ResourceMetadata CreateResourceMetadataAcked(
887
+ std::string serialized_proto, std::string version,
888
+ grpc_millis update_time) {
889
+ XdsApi::ResourceMetadata resource_metadata;
890
+ resource_metadata.serialized_proto = std::move(serialized_proto);
891
+ resource_metadata.update_time = update_time;
892
+ resource_metadata.version = std::move(version);
893
+ resource_metadata.client_status = XdsApi::ResourceMetadata::ACKED;
894
+ return resource_metadata;
895
+ }
896
+
897
+ } // namespace
898
+
899
+ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdateLocked(
900
+ std::string version, grpc_millis update_time,
869
901
  XdsApi::LdsUpdateMap lds_update_map) {
870
902
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
871
903
  gpr_log(GPR_INFO,
@@ -877,23 +909,17 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate(
877
909
  std::set<std::string> rds_resource_names_seen;
878
910
  for (auto& p : lds_update_map) {
879
911
  const std::string& listener_name = p.first;
880
- XdsApi::LdsUpdate& lds_update = p.second;
912
+ XdsApi::LdsUpdate& lds_update = p.second.resource;
881
913
  auto& state = lds_state.subscribed_resources[listener_name];
882
914
  if (state != nullptr) state->Finish();
883
915
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
884
- gpr_log(GPR_INFO, "[xds_client %p] LDS resource %s: route_config_name=%s",
885
- xds_client(), listener_name.c_str(),
886
- (!lds_update.route_config_name.empty()
887
- ? lds_update.route_config_name.c_str()
888
- : "<inlined>"));
889
- if (lds_update.rds_update.has_value()) {
890
- gpr_log(GPR_INFO, "RouteConfiguration: %s",
891
- lds_update.rds_update->ToString().c_str());
892
- }
916
+ gpr_log(GPR_INFO, "[xds_client %p] LDS resource %s: %s", xds_client(),
917
+ listener_name.c_str(), lds_update.ToString().c_str());
893
918
  }
894
919
  // Record the RDS resource names seen.
895
- if (!lds_update.route_config_name.empty()) {
896
- rds_resource_names_seen.insert(lds_update.route_config_name);
920
+ if (!lds_update.http_connection_manager.route_config_name.empty()) {
921
+ rds_resource_names_seen.insert(
922
+ lds_update.http_connection_manager.route_config_name);
897
923
  }
898
924
  // Ignore identical update.
899
925
  ListenerState& listener_state = xds_client()->listener_map_[listener_name];
@@ -909,6 +935,8 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate(
909
935
  }
910
936
  // Update the listener state.
911
937
  listener_state.update = std::move(lds_update);
938
+ listener_state.meta = CreateResourceMetadataAcked(
939
+ std::move(p.second.serialized_proto), version, update_time);
912
940
  // Notify watchers.
913
941
  for (const auto& p : listener_state.watchers) {
914
942
  p.first->OnListenerChanged(*listener_state.update);
@@ -952,7 +980,8 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate(
952
980
  }
953
981
  }
954
982
 
955
- void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdate(
983
+ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdateLocked(
984
+ std::string version, grpc_millis update_time,
956
985
  XdsApi::RdsUpdateMap rds_update_map) {
957
986
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
958
987
  gpr_log(GPR_INFO,
@@ -963,7 +992,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdate(
963
992
  auto& rds_state = state_map_[XdsApi::kRdsTypeUrl];
964
993
  for (auto& p : rds_update_map) {
965
994
  const std::string& route_config_name = p.first;
966
- XdsApi::RdsUpdate& rds_update = p.second;
995
+ XdsApi::RdsUpdate& rds_update = p.second.resource;
967
996
  auto& state = rds_state.subscribed_resources[route_config_name];
968
997
  if (state != nullptr) state->Finish();
969
998
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
@@ -984,6 +1013,8 @@ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdate(
984
1013
  }
985
1014
  // Update the cache.
986
1015
  route_config_state.update = std::move(rds_update);
1016
+ route_config_state.meta = CreateResourceMetadataAcked(
1017
+ std::move(p.second.serialized_proto), version, update_time);
987
1018
  // Notify all watchers.
988
1019
  for (const auto& p : route_config_state.watchers) {
989
1020
  p.first->OnRouteConfigChanged(*route_config_state.update);
@@ -991,7 +1022,8 @@ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdate(
991
1022
  }
992
1023
  }
993
1024
 
994
- void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdate(
1025
+ void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdateLocked(
1026
+ std::string version, grpc_millis update_time,
995
1027
  XdsApi::CdsUpdateMap cds_update_map) {
996
1028
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
997
1029
  gpr_log(GPR_INFO,
@@ -1003,7 +1035,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdate(
1003
1035
  std::set<std::string> eds_resource_names_seen;
1004
1036
  for (auto& p : cds_update_map) {
1005
1037
  const char* cluster_name = p.first.c_str();
1006
- XdsApi::CdsUpdate& cds_update = p.second;
1038
+ XdsApi::CdsUpdate& cds_update = p.second.resource;
1007
1039
  auto& state = cds_state.subscribed_resources[cluster_name];
1008
1040
  if (state != nullptr) state->Finish();
1009
1041
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
@@ -1027,6 +1059,8 @@ void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdate(
1027
1059
  }
1028
1060
  // Update the cluster state.
1029
1061
  cluster_state.update = std::move(cds_update);
1062
+ cluster_state.meta = CreateResourceMetadataAcked(
1063
+ std::move(p.second.serialized_proto), version, update_time);
1030
1064
  // Notify all watchers.
1031
1065
  for (const auto& p : cluster_state.watchers) {
1032
1066
  p.first->OnClusterChanged(cluster_state.update.value());
@@ -1069,7 +1103,8 @@ void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdate(
1069
1103
  }
1070
1104
  }
1071
1105
 
1072
- void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdate(
1106
+ void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdateLocked(
1107
+ std::string version, grpc_millis update_time,
1073
1108
  XdsApi::EdsUpdateMap eds_update_map) {
1074
1109
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1075
1110
  gpr_log(GPR_INFO,
@@ -1080,7 +1115,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdate(
1080
1115
  auto& eds_state = state_map_[XdsApi::kEdsTypeUrl];
1081
1116
  for (auto& p : eds_update_map) {
1082
1117
  const char* eds_service_name = p.first.c_str();
1083
- XdsApi::EdsUpdate& eds_update = p.second;
1118
+ XdsApi::EdsUpdate& eds_update = p.second.resource;
1084
1119
  auto& state = eds_state.subscribed_resources[eds_service_name];
1085
1120
  if (state != nullptr) state->Finish();
1086
1121
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
@@ -1101,6 +1136,8 @@ void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdate(
1101
1136
  }
1102
1137
  // Update the cluster state.
1103
1138
  endpoint_state.update = std::move(eds_update);
1139
+ endpoint_state.meta = CreateResourceMetadataAcked(
1140
+ std::move(p.second.serialized_proto), version, update_time);
1104
1141
  // Notify all watchers.
1105
1142
  for (const auto& p : endpoint_state.watchers) {
1106
1143
  p.first->OnEndpointChanged(endpoint_state.update.value());
@@ -1108,8 +1145,8 @@ void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdate(
1108
1145
  }
1109
1146
  }
1110
1147
 
1111
- void XdsClient::ChannelState::AdsCallState::OnRequestSent(void* arg,
1112
- grpc_error* error) {
1148
+ void XdsClient::ChannelState::AdsCallState::OnRequestSent(
1149
+ void* arg, grpc_error_handle error) {
1113
1150
  AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
1114
1151
  {
1115
1152
  MutexLock lock(&ads_calld->xds_client()->mu_);
@@ -1119,7 +1156,7 @@ void XdsClient::ChannelState::AdsCallState::OnRequestSent(void* arg,
1119
1156
  }
1120
1157
 
1121
1158
  void XdsClient::ChannelState::AdsCallState::OnRequestSentLocked(
1122
- grpc_error* error) {
1159
+ grpc_error_handle error) {
1123
1160
  if (IsCurrentCallOnChannel() && error == GRPC_ERROR_NONE) {
1124
1161
  // Clean up the sent message.
1125
1162
  grpc_byte_buffer_destroy(send_message_payload_);
@@ -1143,7 +1180,7 @@ void XdsClient::ChannelState::AdsCallState::OnRequestSentLocked(
1143
1180
  }
1144
1181
 
1145
1182
  void XdsClient::ChannelState::AdsCallState::OnResponseReceived(
1146
- void* arg, grpc_error* /* error */) {
1183
+ void* arg, grpc_error_handle /* error */) {
1147
1184
  AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
1148
1185
  bool done;
1149
1186
  {
@@ -1167,7 +1204,8 @@ bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1167
1204
  recv_message_payload_ = nullptr;
1168
1205
  // Parse and validate the response.
1169
1206
  XdsApi::AdsParseResult result = xds_client()->api_.ParseAdsResponse(
1170
- response_slice, ResourceNamesForRequest(XdsApi::kLdsTypeUrl),
1207
+ chand()->server_, response_slice,
1208
+ ResourceNamesForRequest(XdsApi::kLdsTypeUrl),
1171
1209
  ResourceNamesForRequest(XdsApi::kRdsTypeUrl),
1172
1210
  ResourceNamesForRequest(XdsApi::kCdsTypeUrl),
1173
1211
  ResourceNamesForRequest(XdsApi::kEdsTypeUrl));
@@ -1176,14 +1214,17 @@ bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1176
1214
  // Ignore unparsable response.
1177
1215
  gpr_log(GPR_ERROR,
1178
1216
  "[xds_client %p] Error parsing ADS response (%s) -- ignoring",
1179
- xds_client(), grpc_error_string(result.parse_error));
1217
+ xds_client(), grpc_error_std_string(result.parse_error).c_str());
1180
1218
  GRPC_ERROR_UNREF(result.parse_error);
1181
1219
  } else {
1220
+ grpc_millis update_time = grpc_core::ExecCtx::Get()->Now();
1182
1221
  // Update nonce.
1183
1222
  auto& state = state_map_[result.type_url];
1184
1223
  state.nonce = std::move(result.nonce);
1185
1224
  // NACK or ACK the response.
1186
1225
  if (result.parse_error != GRPC_ERROR_NONE) {
1226
+ xds_client()->UpdateResourceMetadataWithFailedParseResultLocked(
1227
+ update_time, result);
1187
1228
  GRPC_ERROR_UNREF(state.error);
1188
1229
  state.error = result.parse_error;
1189
1230
  // NACK unacceptable update.
@@ -1191,19 +1232,24 @@ bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1191
1232
  "[xds_client %p] ADS response invalid for resource type %s "
1192
1233
  "version %s, will NACK: nonce=%s error=%s",
1193
1234
  xds_client(), result.type_url.c_str(), result.version.c_str(),
1194
- state.nonce.c_str(), grpc_error_string(result.parse_error));
1235
+ state.nonce.c_str(),
1236
+ grpc_error_std_string(result.parse_error).c_str());
1195
1237
  SendMessageLocked(result.type_url);
1196
1238
  } else {
1197
1239
  seen_response_ = true;
1198
1240
  // Accept the ADS response according to the type_url.
1199
1241
  if (result.type_url == XdsApi::kLdsTypeUrl) {
1200
- AcceptLdsUpdate(std::move(result.lds_update_map));
1242
+ AcceptLdsUpdateLocked(result.version, update_time,
1243
+ std::move(result.lds_update_map));
1201
1244
  } else if (result.type_url == XdsApi::kRdsTypeUrl) {
1202
- AcceptRdsUpdate(std::move(result.rds_update_map));
1245
+ AcceptRdsUpdateLocked(result.version, update_time,
1246
+ std::move(result.rds_update_map));
1203
1247
  } else if (result.type_url == XdsApi::kCdsTypeUrl) {
1204
- AcceptCdsUpdate(std::move(result.cds_update_map));
1248
+ AcceptCdsUpdateLocked(result.version, update_time,
1249
+ std::move(result.cds_update_map));
1205
1250
  } else if (result.type_url == XdsApi::kEdsTypeUrl) {
1206
- AcceptEdsUpdate(std::move(result.eds_update_map));
1251
+ AcceptEdsUpdateLocked(result.version, update_time,
1252
+ std::move(result.eds_update_map));
1207
1253
  }
1208
1254
  xds_client()->resource_version_map_[result.type_url] =
1209
1255
  std::move(result.version);
@@ -1234,7 +1280,7 @@ bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1234
1280
  }
1235
1281
 
1236
1282
  void XdsClient::ChannelState::AdsCallState::OnStatusReceived(
1237
- void* arg, grpc_error* error) {
1283
+ void* arg, grpc_error_handle error) {
1238
1284
  AdsCallState* ads_calld = static_cast<AdsCallState*>(arg);
1239
1285
  {
1240
1286
  MutexLock lock(&ads_calld->xds_client()->mu_);
@@ -1244,14 +1290,14 @@ void XdsClient::ChannelState::AdsCallState::OnStatusReceived(
1244
1290
  }
1245
1291
 
1246
1292
  void XdsClient::ChannelState::AdsCallState::OnStatusReceivedLocked(
1247
- grpc_error* error) {
1293
+ grpc_error_handle error) {
1248
1294
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1249
1295
  char* status_details = grpc_slice_to_c_string(status_details_);
1250
1296
  gpr_log(GPR_INFO,
1251
1297
  "[xds_client %p] ADS call status received. Status = %d, details "
1252
1298
  "= '%s', (chand: %p, ads_calld: %p, call: %p), error '%s'",
1253
1299
  xds_client(), status_code_, status_details, chand(), this, call_,
1254
- grpc_error_string(error));
1300
+ grpc_error_std_string(error).c_str());
1255
1301
  gpr_free(status_details);
1256
1302
  }
1257
1303
  // Ignore status from a stale call.
@@ -1306,7 +1352,7 @@ void XdsClient::ChannelState::LrsCallState::Reporter::
1306
1352
  }
1307
1353
 
1308
1354
  void XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimer(
1309
- void* arg, grpc_error* error) {
1355
+ void* arg, grpc_error_handle error) {
1310
1356
  Reporter* self = static_cast<Reporter*>(arg);
1311
1357
  bool done;
1312
1358
  {
@@ -1317,7 +1363,7 @@ void XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimer(
1317
1363
  }
1318
1364
 
1319
1365
  bool XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimerLocked(
1320
- grpc_error* error) {
1366
+ grpc_error_handle error) {
1321
1367
  next_report_timer_callback_pending_ = false;
1322
1368
  if (error != GRPC_ERROR_NONE || !IsCurrentReporterOnCall()) {
1323
1369
  GRPC_ERROR_UNREF(error);
@@ -1382,7 +1428,7 @@ bool XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() {
1382
1428
  }
1383
1429
 
1384
1430
  void XdsClient::ChannelState::LrsCallState::Reporter::OnReportDone(
1385
- void* arg, grpc_error* error) {
1431
+ void* arg, grpc_error_handle error) {
1386
1432
  Reporter* self = static_cast<Reporter*>(arg);
1387
1433
  bool done;
1388
1434
  {
@@ -1393,7 +1439,7 @@ void XdsClient::ChannelState::LrsCallState::Reporter::OnReportDone(
1393
1439
  }
1394
1440
 
1395
1441
  bool XdsClient::ChannelState::LrsCallState::Reporter::OnReportDoneLocked(
1396
- grpc_error* error) {
1442
+ grpc_error_handle error) {
1397
1443
  grpc_byte_buffer_destroy(parent_->send_message_payload_);
1398
1444
  parent_->send_message_payload_ = nullptr;
1399
1445
  // If there are no more registered stats to report, cancel the call.
@@ -1563,7 +1609,7 @@ void XdsClient::ChannelState::LrsCallState::MaybeStartReportingLocked() {
1563
1609
  }
1564
1610
 
1565
1611
  void XdsClient::ChannelState::LrsCallState::OnInitialRequestSent(
1566
- void* arg, grpc_error* /*error*/) {
1612
+ void* arg, grpc_error_handle /*error*/) {
1567
1613
  LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
1568
1614
  {
1569
1615
  MutexLock lock(&lrs_calld->xds_client()->mu_);
@@ -1580,7 +1626,7 @@ void XdsClient::ChannelState::LrsCallState::OnInitialRequestSentLocked() {
1580
1626
  }
1581
1627
 
1582
1628
  void XdsClient::ChannelState::LrsCallState::OnResponseReceived(
1583
- void* arg, grpc_error* /*error*/) {
1629
+ void* arg, grpc_error_handle /*error*/) {
1584
1630
  LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
1585
1631
  bool done;
1586
1632
  {
@@ -1608,13 +1654,13 @@ bool XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() {
1608
1654
  bool send_all_clusters = false;
1609
1655
  std::set<std::string> new_cluster_names;
1610
1656
  grpc_millis new_load_reporting_interval;
1611
- grpc_error* parse_error = xds_client()->api_.ParseLrsResponse(
1657
+ grpc_error_handle parse_error = xds_client()->api_.ParseLrsResponse(
1612
1658
  response_slice, &send_all_clusters, &new_cluster_names,
1613
1659
  &new_load_reporting_interval);
1614
1660
  if (parse_error != GRPC_ERROR_NONE) {
1615
1661
  gpr_log(GPR_ERROR,
1616
1662
  "[xds_client %p] LRS response parsing failed. error=%s",
1617
- xds_client(), grpc_error_string(parse_error));
1663
+ xds_client(), grpc_error_std_string(parse_error).c_str());
1618
1664
  GRPC_ERROR_UNREF(parse_error);
1619
1665
  return;
1620
1666
  }
@@ -1683,7 +1729,7 @@ bool XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() {
1683
1729
  }
1684
1730
 
1685
1731
  void XdsClient::ChannelState::LrsCallState::OnStatusReceived(
1686
- void* arg, grpc_error* error) {
1732
+ void* arg, grpc_error_handle error) {
1687
1733
  LrsCallState* lrs_calld = static_cast<LrsCallState*>(arg);
1688
1734
  {
1689
1735
  MutexLock lock(&lrs_calld->xds_client()->mu_);
@@ -1693,7 +1739,7 @@ void XdsClient::ChannelState::LrsCallState::OnStatusReceived(
1693
1739
  }
1694
1740
 
1695
1741
  void XdsClient::ChannelState::LrsCallState::OnStatusReceivedLocked(
1696
- grpc_error* error) {
1742
+ grpc_error_handle error) {
1697
1743
  GPR_ASSERT(call_ != nullptr);
1698
1744
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1699
1745
  char* status_details = grpc_slice_to_c_string(status_details_);
@@ -1701,7 +1747,7 @@ void XdsClient::ChannelState::LrsCallState::OnStatusReceivedLocked(
1701
1747
  "[xds_client %p] LRS call status received. Status = %d, details "
1702
1748
  "= '%s', (chand: %p, calld: %p, call: %p), error '%s'",
1703
1749
  xds_client(), status_code_, status_details, chand(), this, call_,
1704
- grpc_error_string(error));
1750
+ grpc_error_std_string(error).c_str());
1705
1751
  gpr_free(status_details);
1706
1752
  }
1707
1753
  // Ignore status from a stale call.
@@ -1726,36 +1772,41 @@ bool XdsClient::ChannelState::LrsCallState::IsCurrentCallOnChannel() const {
1726
1772
 
1727
1773
  namespace {
1728
1774
 
1729
- grpc_millis GetRequestTimeout() {
1775
+ grpc_millis GetRequestTimeout(const grpc_channel_args* args) {
1730
1776
  return grpc_channel_args_find_integer(
1731
- g_channel_args, GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS,
1777
+ args, GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS,
1732
1778
  {15000, 0, INT_MAX});
1733
1779
  }
1734
1780
 
1781
+ grpc_channel_args* ModifyChannelArgs(const grpc_channel_args* args) {
1782
+ absl::InlinedVector<grpc_arg, 2> args_to_add = {
1783
+ grpc_channel_arg_integer_create(
1784
+ const_cast<char*>(GRPC_ARG_KEEPALIVE_TIME_MS),
1785
+ 5 * 60 * GPR_MS_PER_SEC),
1786
+ grpc_channel_arg_integer_create(
1787
+ const_cast<char*>(GRPC_ARG_CHANNELZ_IS_INTERNAL_CHANNEL), 1),
1788
+ };
1789
+ return grpc_channel_args_copy_and_add(args, args_to_add.data(),
1790
+ args_to_add.size());
1791
+ }
1792
+
1735
1793
  } // namespace
1736
1794
 
1737
- XdsClient::XdsClient(grpc_error** error)
1795
+ XdsClient::XdsClient(std::unique_ptr<XdsBootstrap> bootstrap,
1796
+ const grpc_channel_args* args)
1738
1797
  : DualRefCounted<XdsClient>(
1739
1798
  GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_refcount_trace) ? "XdsClient"
1740
1799
  : nullptr),
1741
- request_timeout_(GetRequestTimeout()),
1800
+ bootstrap_(std::move(bootstrap)),
1801
+ args_(ModifyChannelArgs(args)),
1802
+ request_timeout_(GetRequestTimeout(args)),
1742
1803
  interested_parties_(grpc_pollset_set_create()),
1743
- bootstrap_(
1744
- XdsBootstrap::ReadFromFile(this, &grpc_xds_client_trace, error)),
1745
1804
  certificate_provider_store_(MakeOrphanable<CertificateProviderStore>(
1746
- bootstrap_ == nullptr
1747
- ? CertificateProviderStore::PluginDefinitionMap()
1748
- : bootstrap_->certificate_providers())),
1749
- api_(this, &grpc_xds_client_trace,
1750
- bootstrap_ == nullptr ? nullptr : bootstrap_->node()) {
1805
+ bootstrap_->certificate_providers())),
1806
+ api_(this, &grpc_xds_client_trace, bootstrap_->node()) {
1751
1807
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1752
1808
  gpr_log(GPR_INFO, "[xds_client %p] creating xds client", this);
1753
1809
  }
1754
- if (*error != GRPC_ERROR_NONE) {
1755
- gpr_log(GPR_ERROR, "[xds_client %p] failed to read bootstrap file: %s",
1756
- this, grpc_error_string(*error));
1757
- return;
1758
- }
1759
1810
  // Create ChannelState object.
1760
1811
  chand_ = MakeOrphanable<ChannelState>(
1761
1812
  WeakRef(DEBUG_LOCATION, "XdsClient+ChannelState"), bootstrap_->server());
@@ -1765,11 +1816,13 @@ XdsClient::~XdsClient() {
1765
1816
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1766
1817
  gpr_log(GPR_INFO, "[xds_client %p] destroying xds client", this);
1767
1818
  }
1819
+ grpc_channel_args_destroy(args_);
1768
1820
  grpc_pollset_set_destroy(interested_parties_);
1769
1821
  }
1770
1822
 
1771
1823
  void XdsClient::AddChannelzLinkage(
1772
1824
  channelz::ChannelNode* parent_channelz_node) {
1825
+ MutexLock lock(&mu_);
1773
1826
  channelz::ChannelNode* xds_channelz_node =
1774
1827
  grpc_channel_get_channelz_node(chand_->channel());
1775
1828
  if (xds_channelz_node != nullptr) {
@@ -1779,6 +1832,7 @@ void XdsClient::AddChannelzLinkage(
1779
1832
 
1780
1833
  void XdsClient::RemoveChannelzLinkage(
1781
1834
  channelz::ChannelNode* parent_channelz_node) {
1835
+ MutexLock lock(&mu_);
1782
1836
  channelz::ChannelNode* xds_channelz_node =
1783
1837
  grpc_channel_get_channelz_node(chand_->channel());
1784
1838
  if (xds_channelz_node != nullptr) {
@@ -1829,7 +1883,7 @@ void XdsClient::WatchListenerData(
1829
1883
  }
1830
1884
  w->OnListenerChanged(*listener_state.update);
1831
1885
  }
1832
- chand_->Subscribe(XdsApi::kLdsTypeUrl, listener_name_str);
1886
+ chand_->SubscribeLocked(XdsApi::kLdsTypeUrl, listener_name_str);
1833
1887
  }
1834
1888
 
1835
1889
  void XdsClient::CancelListenerDataWatch(absl::string_view listener_name,
@@ -1844,8 +1898,8 @@ void XdsClient::CancelListenerDataWatch(absl::string_view listener_name,
1844
1898
  listener_state.watchers.erase(it);
1845
1899
  if (listener_state.watchers.empty()) {
1846
1900
  listener_map_.erase(listener_name_str);
1847
- chand_->Unsubscribe(XdsApi::kLdsTypeUrl, listener_name_str,
1848
- delay_unsubscription);
1901
+ chand_->UnsubscribeLocked(XdsApi::kLdsTypeUrl, listener_name_str,
1902
+ delay_unsubscription);
1849
1903
  }
1850
1904
  }
1851
1905
  }
@@ -1869,7 +1923,7 @@ void XdsClient::WatchRouteConfigData(
1869
1923
  }
1870
1924
  w->OnRouteConfigChanged(*route_config_state.update);
1871
1925
  }
1872
- chand_->Subscribe(XdsApi::kRdsTypeUrl, route_config_name_str);
1926
+ chand_->SubscribeLocked(XdsApi::kRdsTypeUrl, route_config_name_str);
1873
1927
  }
1874
1928
 
1875
1929
  void XdsClient::CancelRouteConfigDataWatch(absl::string_view route_config_name,
@@ -1885,8 +1939,8 @@ void XdsClient::CancelRouteConfigDataWatch(absl::string_view route_config_name,
1885
1939
  route_config_state.watchers.erase(it);
1886
1940
  if (route_config_state.watchers.empty()) {
1887
1941
  route_config_map_.erase(route_config_name_str);
1888
- chand_->Unsubscribe(XdsApi::kRdsTypeUrl, route_config_name_str,
1889
- delay_unsubscription);
1942
+ chand_->UnsubscribeLocked(XdsApi::kRdsTypeUrl, route_config_name_str,
1943
+ delay_unsubscription);
1890
1944
  }
1891
1945
  }
1892
1946
  }
@@ -1908,7 +1962,7 @@ void XdsClient::WatchClusterData(
1908
1962
  }
1909
1963
  w->OnClusterChanged(cluster_state.update.value());
1910
1964
  }
1911
- chand_->Subscribe(XdsApi::kCdsTypeUrl, cluster_name_str);
1965
+ chand_->SubscribeLocked(XdsApi::kCdsTypeUrl, cluster_name_str);
1912
1966
  }
1913
1967
 
1914
1968
  void XdsClient::CancelClusterDataWatch(absl::string_view cluster_name,
@@ -1923,8 +1977,8 @@ void XdsClient::CancelClusterDataWatch(absl::string_view cluster_name,
1923
1977
  cluster_state.watchers.erase(it);
1924
1978
  if (cluster_state.watchers.empty()) {
1925
1979
  cluster_map_.erase(cluster_name_str);
1926
- chand_->Unsubscribe(XdsApi::kCdsTypeUrl, cluster_name_str,
1927
- delay_unsubscription);
1980
+ chand_->UnsubscribeLocked(XdsApi::kCdsTypeUrl, cluster_name_str,
1981
+ delay_unsubscription);
1928
1982
  }
1929
1983
  }
1930
1984
  }
@@ -1946,7 +2000,7 @@ void XdsClient::WatchEndpointData(
1946
2000
  }
1947
2001
  w->OnEndpointChanged(endpoint_state.update.value());
1948
2002
  }
1949
- chand_->Subscribe(XdsApi::kEdsTypeUrl, eds_service_name_str);
2003
+ chand_->SubscribeLocked(XdsApi::kEdsTypeUrl, eds_service_name_str);
1950
2004
  }
1951
2005
 
1952
2006
  void XdsClient::CancelEndpointDataWatch(absl::string_view eds_service_name,
@@ -1961,8 +2015,8 @@ void XdsClient::CancelEndpointDataWatch(absl::string_view eds_service_name,
1961
2015
  endpoint_state.watchers.erase(it);
1962
2016
  if (endpoint_state.watchers.empty()) {
1963
2017
  endpoint_map_.erase(eds_service_name_str);
1964
- chand_->Unsubscribe(XdsApi::kEdsTypeUrl, eds_service_name_str,
1965
- delay_unsubscription);
2018
+ chand_->UnsubscribeLocked(XdsApi::kEdsTypeUrl, eds_service_name_str,
2019
+ delay_unsubscription);
1966
2020
  }
1967
2021
  }
1968
2022
  }
@@ -2089,7 +2143,7 @@ void XdsClient::ResetBackoff() {
2089
2143
  }
2090
2144
  }
2091
2145
 
2092
- void XdsClient::NotifyOnErrorLocked(grpc_error* error) {
2146
+ void XdsClient::NotifyOnErrorLocked(grpc_error_handle error) {
2093
2147
  for (const auto& p : listener_map_) {
2094
2148
  const ListenerState& listener_state = p.second;
2095
2149
  for (const auto& p : listener_state.watchers) {
@@ -2198,25 +2252,190 @@ XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshotLocked(
2198
2252
  return snapshot_map;
2199
2253
  }
2200
2254
 
2255
+ void XdsClient::UpdateResourceMetadataWithFailedParseResultLocked(
2256
+ grpc_millis update_time, const XdsApi::AdsParseResult& result) {
2257
+ // ADS update is rejected and the resource names in the failed update is
2258
+ // available.
2259
+ std::string details = grpc_error_std_string(result.parse_error);
2260
+ for (auto& name : result.resource_names_failed) {
2261
+ XdsApi::ResourceMetadata* resource_metadata = nullptr;
2262
+ if (result.type_url == XdsApi::kLdsTypeUrl) {
2263
+ auto it = listener_map_.find(name);
2264
+ if (it != listener_map_.end()) {
2265
+ resource_metadata = &it->second.meta;
2266
+ }
2267
+ } else if (result.type_url == XdsApi::kRdsTypeUrl) {
2268
+ auto it = route_config_map_.find(name);
2269
+ if (route_config_map_.find(name) != route_config_map_.end()) {
2270
+ resource_metadata = &it->second.meta;
2271
+ }
2272
+ } else if (result.type_url == XdsApi::kCdsTypeUrl) {
2273
+ auto it = cluster_map_.find(name);
2274
+ if (cluster_map_.find(name) != cluster_map_.end()) {
2275
+ resource_metadata = &it->second.meta;
2276
+ }
2277
+ } else if (result.type_url == XdsApi::kEdsTypeUrl) {
2278
+ auto it = endpoint_map_.find(name);
2279
+ if (endpoint_map_.find(name) != endpoint_map_.end()) {
2280
+ resource_metadata = &it->second.meta;
2281
+ }
2282
+ }
2283
+ if (resource_metadata == nullptr) {
2284
+ return;
2285
+ }
2286
+ resource_metadata->client_status = XdsApi::ResourceMetadata::NACKED;
2287
+ resource_metadata->failed_version = result.version;
2288
+ resource_metadata->failed_details = details;
2289
+ resource_metadata->failed_update_time = update_time;
2290
+ }
2291
+ }
2292
+
2293
+ std::string XdsClient::DumpClientConfigBinary() {
2294
+ MutexLock lock(&mu_);
2295
+ XdsApi::ResourceTypeMetadataMap resource_type_metadata_map;
2296
+ // Update per-xds-type version if available, this version corresponding to the
2297
+ // last successful ADS update version.
2298
+ for (auto& p : resource_version_map_) {
2299
+ resource_type_metadata_map[p.first].version = p.second;
2300
+ }
2301
+ // Collect resource metadata from listeners
2302
+ auto& lds_map =
2303
+ resource_type_metadata_map[XdsApi::kLdsTypeUrl].resource_metadata_map;
2304
+ for (auto& p : listener_map_) {
2305
+ lds_map[p.first] = &p.second.meta;
2306
+ }
2307
+ // Collect resource metadata from route configs
2308
+ auto& rds_map =
2309
+ resource_type_metadata_map[XdsApi::kRdsTypeUrl].resource_metadata_map;
2310
+ for (auto& p : route_config_map_) {
2311
+ rds_map[p.first] = &p.second.meta;
2312
+ }
2313
+ // Collect resource metadata from clusters
2314
+ auto& cds_map =
2315
+ resource_type_metadata_map[XdsApi::kCdsTypeUrl].resource_metadata_map;
2316
+ for (auto& p : cluster_map_) {
2317
+ cds_map[p.first] = &p.second.meta;
2318
+ }
2319
+ // Collect resource metadata from endpoints
2320
+ auto& eds_map =
2321
+ resource_type_metadata_map[XdsApi::kEdsTypeUrl].resource_metadata_map;
2322
+ for (auto& p : endpoint_map_) {
2323
+ eds_map[p.first] = &p.second.meta;
2324
+ }
2325
+ // Assemble config dump messages
2326
+ return api_.AssembleClientConfig(resource_type_metadata_map);
2327
+ }
2328
+
2201
2329
  //
2202
2330
  // accessors for global state
2203
2331
  //
2204
2332
 
2205
- void XdsClientGlobalInit() { g_mu = new Mutex; }
2333
+ void XdsClientGlobalInit() {
2334
+ g_mu = new Mutex;
2335
+ XdsHttpFilterRegistry::Init();
2336
+ }
2206
2337
 
2207
- void XdsClientGlobalShutdown() {
2338
+ // TODO(roth): Find a better way to clear the fallback config that does
2339
+ // not require using ABSL_NO_THREAD_SAFETY_ANALYSIS.
2340
+ void XdsClientGlobalShutdown() ABSL_NO_THREAD_SAFETY_ANALYSIS {
2341
+ gpr_free(g_fallback_bootstrap_config);
2342
+ g_fallback_bootstrap_config = nullptr;
2208
2343
  delete g_mu;
2209
2344
  g_mu = nullptr;
2345
+ XdsHttpFilterRegistry::Shutdown();
2210
2346
  }
2211
2347
 
2212
- RefCountedPtr<XdsClient> XdsClient::GetOrCreate(grpc_error** error) {
2213
- MutexLock lock(g_mu);
2214
- if (g_xds_client != nullptr) {
2215
- auto xds_client = g_xds_client->RefIfNonZero();
2216
- if (xds_client != nullptr) return xds_client;
2348
+ namespace {
2349
+
2350
+ std::string GetBootstrapContents(const char* fallback_config,
2351
+ grpc_error_handle* error) {
2352
+ // First, try GRPC_XDS_BOOTSTRAP env var.
2353
+ grpc_core::UniquePtr<char> path(gpr_getenv("GRPC_XDS_BOOTSTRAP"));
2354
+ if (path != nullptr) {
2355
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2356
+ gpr_log(GPR_INFO,
2357
+ "Got bootstrap file location from GRPC_XDS_BOOTSTRAP "
2358
+ "environment variable: %s",
2359
+ path.get());
2360
+ }
2361
+ grpc_slice contents;
2362
+ *error =
2363
+ grpc_load_file(path.get(), /*add_null_terminator=*/true, &contents);
2364
+ if (*error != GRPC_ERROR_NONE) return "";
2365
+ std::string contents_str(StringViewFromSlice(contents));
2366
+ grpc_slice_unref_internal(contents);
2367
+ return contents_str;
2368
+ }
2369
+ // Next, try GRPC_XDS_BOOTSTRAP_CONFIG env var.
2370
+ grpc_core::UniquePtr<char> env_config(
2371
+ gpr_getenv("GRPC_XDS_BOOTSTRAP_CONFIG"));
2372
+ if (env_config != nullptr) {
2373
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2374
+ gpr_log(GPR_INFO,
2375
+ "Got bootstrap contents from GRPC_XDS_BOOTSTRAP_CONFIG "
2376
+ "environment variable");
2377
+ }
2378
+ return env_config.get();
2379
+ }
2380
+ // Finally, try fallback config.
2381
+ if (fallback_config != nullptr) {
2382
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2383
+ gpr_log(GPR_INFO, "Got bootstrap contents from fallback config");
2384
+ }
2385
+ return fallback_config;
2386
+ }
2387
+ // No bootstrap config found.
2388
+ *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2389
+ "Environment variables GRPC_XDS_BOOTSTRAP or GRPC_XDS_BOOTSTRAP_CONFIG "
2390
+ "not defined");
2391
+ return "";
2392
+ }
2393
+
2394
+ } // namespace
2395
+
2396
+ RefCountedPtr<XdsClient> XdsClient::GetOrCreate(const grpc_channel_args* args,
2397
+ grpc_error_handle* error) {
2398
+ RefCountedPtr<XdsClient> xds_client;
2399
+ // If getting bootstrap from channel args, create a local XdsClient
2400
+ // instance for the channel or server instead of using the global instance.
2401
+ const char* bootstrap_config = grpc_channel_args_find_string(
2402
+ args, GRPC_ARG_TEST_ONLY_DO_NOT_USE_IN_PROD_XDS_BOOTSTRAP_CONFIG);
2403
+ if (bootstrap_config != nullptr) {
2404
+ std::unique_ptr<XdsBootstrap> bootstrap =
2405
+ XdsBootstrap::Create(bootstrap_config, error);
2406
+ if (*error == GRPC_ERROR_NONE) {
2407
+ grpc_channel_args* xds_channel_args =
2408
+ grpc_channel_args_find_pointer<grpc_channel_args>(
2409
+ args,
2410
+ GRPC_ARG_TEST_ONLY_DO_NOT_USE_IN_PROD_XDS_CLIENT_CHANNEL_ARGS);
2411
+ return MakeRefCounted<XdsClient>(std::move(bootstrap), xds_channel_args);
2412
+ }
2413
+ return nullptr;
2414
+ }
2415
+ // Otherwise, use the global instance.
2416
+ {
2417
+ MutexLock lock(g_mu);
2418
+ if (g_xds_client != nullptr) {
2419
+ auto xds_client = g_xds_client->RefIfNonZero();
2420
+ if (xds_client != nullptr) return xds_client;
2421
+ }
2422
+ // Find bootstrap contents.
2423
+ std::string bootstrap_contents =
2424
+ GetBootstrapContents(g_fallback_bootstrap_config, error);
2425
+ if (*error != GRPC_ERROR_NONE) return nullptr;
2426
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2427
+ gpr_log(GPR_INFO, "xDS bootstrap contents: %s",
2428
+ bootstrap_contents.c_str());
2429
+ }
2430
+ // Parse bootstrap.
2431
+ std::unique_ptr<XdsBootstrap> bootstrap =
2432
+ XdsBootstrap::Create(bootstrap_contents, error);
2433
+ if (*error != GRPC_ERROR_NONE) return nullptr;
2434
+ // Instantiate XdsClient.
2435
+ xds_client =
2436
+ MakeRefCounted<XdsClient>(std::move(bootstrap), g_channel_args);
2437
+ g_xds_client = xds_client.get();
2217
2438
  }
2218
- auto xds_client = MakeRefCounted<XdsClient>(error);
2219
- g_xds_client = xds_client.get();
2220
2439
  return xds_client;
2221
2440
  }
2222
2441
 
@@ -2232,6 +2451,66 @@ void UnsetGlobalXdsClientForTest() {
2232
2451
  g_xds_client = nullptr;
2233
2452
  }
2234
2453
 
2454
+ void SetXdsFallbackBootstrapConfig(const char* config) {
2455
+ MutexLock lock(g_mu);
2456
+ gpr_free(g_fallback_bootstrap_config);
2457
+ g_fallback_bootstrap_config = gpr_strdup(config);
2458
+ }
2459
+
2235
2460
  } // namespace internal
2236
2461
 
2462
+ //
2463
+ // embedding XdsClient in channel args
2464
+ //
2465
+
2466
+ #define GRPC_ARG_XDS_CLIENT "grpc.internal.xds_client"
2467
+
2468
+ namespace {
2469
+
2470
+ void* XdsClientArgCopy(void* p) {
2471
+ XdsClient* xds_client = static_cast<XdsClient*>(p);
2472
+ xds_client->Ref(DEBUG_LOCATION, "channel arg").release();
2473
+ return p;
2474
+ }
2475
+
2476
+ void XdsClientArgDestroy(void* p) {
2477
+ XdsClient* xds_client = static_cast<XdsClient*>(p);
2478
+ xds_client->Unref(DEBUG_LOCATION, "channel arg");
2479
+ }
2480
+
2481
+ int XdsClientArgCmp(void* p, void* q) { return GPR_ICMP(p, q); }
2482
+
2483
+ const grpc_arg_pointer_vtable kXdsClientArgVtable = {
2484
+ XdsClientArgCopy, XdsClientArgDestroy, XdsClientArgCmp};
2485
+
2486
+ } // namespace
2487
+
2488
+ grpc_arg XdsClient::MakeChannelArg() const {
2489
+ return grpc_channel_arg_pointer_create(const_cast<char*>(GRPC_ARG_XDS_CLIENT),
2490
+ const_cast<XdsClient*>(this),
2491
+ &kXdsClientArgVtable);
2492
+ }
2493
+
2494
+ RefCountedPtr<XdsClient> XdsClient::GetFromChannelArgs(
2495
+ const grpc_channel_args& args) {
2496
+ XdsClient* xds_client =
2497
+ grpc_channel_args_find_pointer<XdsClient>(&args, GRPC_ARG_XDS_CLIENT);
2498
+ if (xds_client == nullptr) return nullptr;
2499
+ return xds_client->Ref(DEBUG_LOCATION, "GetFromChannelArgs");
2500
+ }
2501
+
2237
2502
  } // namespace grpc_core
2503
+
2504
+ // The returned bytes may contain NULL(0), so we can't use c-string.
2505
+ grpc_slice grpc_dump_xds_configs() {
2506
+ grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
2507
+ grpc_core::ExecCtx exec_ctx;
2508
+ grpc_error_handle error = GRPC_ERROR_NONE;
2509
+ auto xds_client = grpc_core::XdsClient::GetOrCreate(nullptr, &error);
2510
+ if (error != GRPC_ERROR_NONE) {
2511
+ // If we isn't using xDS, just return an empty string.
2512
+ GRPC_ERROR_UNREF(error);
2513
+ return grpc_empty_slice();
2514
+ }
2515
+ return grpc_slice_from_cpp_string(xds_client->DumpClientConfigBinary());
2516
+ }