grpc 1.73.0 → 1.74.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +38 -17
  3. data/include/grpc/create_channel_from_endpoint.h +54 -0
  4. data/include/grpc/credentials.h +11 -5
  5. data/include/grpc/event_engine/event_engine.h +74 -17
  6. data/include/grpc/grpc_posix.h +20 -1
  7. data/include/grpc/impl/channel_arg_names.h +2 -4
  8. data/include/grpc/module.modulemap +1 -0
  9. data/include/grpc/support/json.h +24 -0
  10. data/src/core/call/interception_chain.h +7 -11
  11. data/src/core/channelz/channel_trace.cc +213 -115
  12. data/src/core/channelz/channel_trace.h +380 -86
  13. data/src/core/channelz/channelz.cc +270 -181
  14. data/src/core/channelz/channelz.h +168 -55
  15. data/src/core/channelz/channelz_registry.cc +2 -1
  16. data/src/core/channelz/channelz_registry.h +24 -0
  17. data/src/core/channelz/property_list.cc +357 -0
  18. data/src/core/channelz/property_list.h +202 -0
  19. data/src/core/channelz/ztrace_collector.h +3 -2
  20. data/src/core/client_channel/backup_poller.cc +17 -2
  21. data/src/core/client_channel/client_channel.cc +17 -28
  22. data/src/core/client_channel/client_channel_filter.cc +19 -29
  23. data/src/core/client_channel/config_selector.h +8 -2
  24. data/src/core/client_channel/dynamic_filters.cc +5 -6
  25. data/src/core/client_channel/dynamic_filters.h +1 -1
  26. data/src/core/client_channel/global_subchannel_pool.cc +4 -1
  27. data/src/core/client_channel/retry_filter.cc +21 -27
  28. data/src/core/client_channel/retry_filter.h +10 -7
  29. data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -5
  30. data/src/core/client_channel/retry_filter_legacy_call_data.h +1 -1
  31. data/src/core/client_channel/retry_interceptor.cc +30 -44
  32. data/src/core/client_channel/retry_interceptor.h +18 -17
  33. data/src/core/client_channel/retry_throttle.cc +46 -61
  34. data/src/core/client_channel/retry_throttle.h +17 -39
  35. data/src/core/client_channel/subchannel.cc +43 -19
  36. data/src/core/client_channel/subchannel.h +8 -0
  37. data/src/core/config/config_vars.cc +2 -0
  38. data/src/core/config/core_configuration.cc +1 -0
  39. data/src/core/config/core_configuration.h +11 -0
  40. data/src/core/credentials/call/call_creds_registry.h +125 -0
  41. data/src/core/credentials/call/call_creds_registry_init.cc +91 -0
  42. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +6 -48
  43. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +86 -0
  44. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.h +74 -0
  45. data/src/core/credentials/call/jwt_util.cc +70 -0
  46. data/src/core/credentials/call/jwt_util.h +32 -0
  47. data/src/core/credentials/transport/channel_creds_registry_init.cc +1 -1
  48. data/src/core/credentials/transport/google_default/google_default_credentials.cc +72 -4
  49. data/src/core/credentials/transport/ssl/ssl_credentials.cc +0 -1
  50. data/src/core/credentials/transport/tls/load_system_roots_supported.cc +1 -0
  51. data/src/core/credentials/transport/xds/xds_credentials.cc +0 -3
  52. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +8 -8
  53. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +16 -16
  54. data/src/core/ext/filters/http/client_authority_filter.cc +2 -4
  55. data/src/core/ext/filters/http/message_compress/compression_filter.h +25 -22
  56. data/src/core/ext/filters/http/server/http_server_filter.h +12 -11
  57. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +120 -35
  58. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +6 -5
  59. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +162 -115
  60. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +0 -3
  61. data/src/core/ext/transport/chttp2/transport/decode_huff.cc +1239 -3514
  62. data/src/core/ext/transport/chttp2/transport/decode_huff.h +1008 -1486
  63. data/src/core/ext/transport/chttp2/transport/flow_control.h +22 -17
  64. data/src/core/ext/transport/chttp2/transport/frame.cc +10 -0
  65. data/src/core/ext/transport/chttp2/transport/frame.h +2 -2
  66. data/src/core/ext/transport/chttp2/transport/frame_data.cc +1 -1
  67. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +7 -8
  68. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -5
  69. data/src/core/ext/transport/chttp2/transport/header_assembler.h +299 -0
  70. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +1 -1
  71. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +11 -5
  72. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +12 -1
  73. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +1017 -0
  74. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +593 -0
  75. data/src/core/ext/transport/chttp2/transport/http2_settings.h +19 -22
  76. data/{third_party/abseil-cpp/absl/strings/cord_buffer.cc → src/core/ext/transport/chttp2/transport/http2_stats_collector.cc} +14 -14
  77. data/src/core/ext/transport/chttp2/transport/http2_stats_collector.h +33 -0
  78. data/src/core/ext/transport/chttp2/transport/http2_status.h +6 -1
  79. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +43 -0
  80. data/src/core/ext/transport/chttp2/transport/http2_transport.h +65 -0
  81. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +0 -29
  82. data/src/core/ext/transport/chttp2/transport/internal.h +18 -8
  83. data/src/core/ext/transport/chttp2/transport/keepalive.cc +105 -0
  84. data/src/core/ext/transport/chttp2/transport/keepalive.h +138 -0
  85. data/src/core/ext/transport/chttp2/transport/message_assembler.h +185 -0
  86. data/src/core/ext/transport/chttp2/transport/parsing.cc +2 -4
  87. data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +19 -0
  88. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +151 -0
  89. data/src/core/ext/transport/chttp2/transport/ping_promise.h +180 -0
  90. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +5 -9
  91. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.h +11 -0
  92. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +39 -1
  93. data/src/core/ext/transport/chttp2/transport/transport_common.cc +19 -0
  94. data/src/core/ext/transport/chttp2/transport/transport_common.h +27 -0
  95. data/src/core/ext/transport/chttp2/transport/writing.cc +37 -11
  96. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb.h +571 -0
  97. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.c +120 -0
  98. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.h +36 -0
  99. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb.h +1272 -0
  100. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.c +312 -0
  101. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.h +50 -0
  102. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb.h +984 -0
  103. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.c +226 -0
  104. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.h +44 -0
  105. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.c +175 -0
  106. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.h +82 -0
  107. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.c +135 -0
  108. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.h +67 -0
  109. data/src/core/filter/auth/auth_filters.h +0 -25
  110. data/src/core/filter/auth/client_auth_filter.cc +0 -118
  111. data/src/core/filter/filter_args.h +9 -23
  112. data/src/core/handshaker/handshaker.cc +23 -14
  113. data/src/core/handshaker/handshaker.h +3 -0
  114. data/src/core/handshaker/http_connect/http_connect_handshaker.cc +3 -1
  115. data/src/core/handshaker/security/legacy_secure_endpoint.cc +6 -5
  116. data/src/core/handshaker/security/secure_endpoint.cc +70 -25
  117. data/src/core/handshaker/security/security_handshaker.cc +4 -1
  118. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +7 -1
  119. data/src/core/lib/channel/channel_args.cc +15 -0
  120. data/src/core/lib/channel/channel_args.h +3 -0
  121. data/src/core/lib/channel/channel_stack.cc +22 -23
  122. data/src/core/lib/channel/channel_stack.h +9 -7
  123. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -1
  124. data/src/core/lib/channel/channel_stack_builder_impl.h +2 -7
  125. data/src/core/lib/channel/promise_based_filter.h +5 -5
  126. data/src/core/lib/debug/trace_impl.h +0 -1
  127. data/src/core/lib/event_engine/ares_resolver.cc +165 -46
  128. data/src/core/lib/event_engine/ares_resolver.h +48 -2
  129. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +3 -1
  130. data/src/core/lib/event_engine/cf_engine/cf_engine.h +1 -4
  131. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +2 -6
  132. data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.cc +40 -0
  133. data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.h +60 -0
  134. data/src/core/lib/event_engine/event_engine.cc +7 -0
  135. data/src/core/lib/event_engine/extensions/channelz.h +10 -6
  136. data/src/core/lib/event_engine/grpc_polled_fd.h +5 -0
  137. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +130 -162
  138. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +11 -15
  139. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +75 -117
  140. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +7 -9
  141. data/src/core/lib/event_engine/posix_engine/event_poller.h +18 -15
  142. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +0 -18
  143. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +124 -0
  144. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.h +243 -0
  145. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +29 -19
  146. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +6 -2
  147. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +6 -1
  148. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +145 -92
  149. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +9 -19
  150. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +333 -116
  151. data/src/core/lib/event_engine/posix_engine/posix_engine.h +61 -18
  152. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +45 -37
  153. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +6 -4
  154. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +32 -142
  155. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +6 -5
  156. data/src/core/lib/event_engine/posix_engine/posix_interface.h +211 -0
  157. data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +1083 -0
  158. data/src/core/lib/event_engine/posix_engine/posix_interface_windows.cc +281 -0
  159. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.cc +154 -0
  160. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.h +174 -0
  161. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +3 -719
  162. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +10 -170
  163. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +33 -22
  164. data/src/core/lib/event_engine/posix_engine/timer_manager.h +13 -11
  165. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +117 -151
  166. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +26 -94
  167. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +26 -25
  168. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +6 -2
  169. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +36 -62
  170. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +6 -2
  171. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +7 -6
  172. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +12 -6
  173. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +3 -1
  174. data/src/core/lib/event_engine/shim.cc +9 -0
  175. data/src/core/lib/event_engine/shim.h +3 -0
  176. data/src/core/lib/event_engine/thread_pool/thread_pool.h +7 -3
  177. data/src/core/lib/event_engine/thread_pool/thread_pool_factory.cc +0 -17
  178. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +4 -2
  179. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -2
  180. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +4 -0
  181. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.h +4 -0
  182. data/src/core/lib/event_engine/windows/windows_endpoint.h +2 -6
  183. data/src/core/lib/event_engine/windows/windows_engine.cc +0 -1
  184. data/src/core/lib/event_engine/windows/windows_engine.h +1 -3
  185. data/src/core/lib/event_engine/windows/windows_listener.cc +14 -2
  186. data/src/core/lib/experiments/experiments.cc +45 -93
  187. data/src/core/lib/experiments/experiments.h +21 -51
  188. data/src/core/lib/iomgr/endpoint.cc +4 -3
  189. data/src/core/lib/iomgr/endpoint.h +7 -4
  190. data/src/core/lib/iomgr/endpoint_cfstream.cc +3 -2
  191. data/src/core/lib/iomgr/ev_epoll1_linux.cc +7 -2
  192. data/src/core/lib/iomgr/ev_poll_posix.cc +7 -2
  193. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +4 -6
  194. data/src/core/lib/iomgr/tcp_posix.cc +12 -6
  195. data/src/core/lib/iomgr/tcp_windows.cc +3 -2
  196. data/src/core/lib/promise/activity.h +1 -0
  197. data/src/core/lib/promise/arena_promise.h +23 -7
  198. data/src/core/lib/promise/detail/promise_factory.h +10 -0
  199. data/src/core/lib/promise/detail/promise_like.h +118 -11
  200. data/src/core/lib/promise/detail/promise_variant.h +50 -0
  201. data/src/core/lib/promise/detail/seq_state.h +687 -548
  202. data/src/core/lib/promise/if.h +20 -0
  203. data/src/core/lib/promise/inter_activity_latch.h +147 -0
  204. data/src/core/lib/promise/inter_activity_mutex.h +547 -0
  205. data/src/core/lib/promise/loop.h +65 -3
  206. data/src/core/lib/promise/map.h +24 -0
  207. data/src/core/lib/promise/match_promise.h +103 -0
  208. data/src/core/lib/promise/mpsc.cc +425 -0
  209. data/src/core/lib/promise/mpsc.h +490 -0
  210. data/src/core/lib/promise/party.cc +50 -1
  211. data/src/core/lib/promise/party.h +66 -1
  212. data/src/core/lib/promise/race.h +31 -0
  213. data/src/core/lib/promise/seq.h +4 -1
  214. data/src/core/lib/promise/status_flag.h +7 -0
  215. data/src/core/lib/promise/try_seq.h +4 -1
  216. data/src/core/lib/promise/wait_set.cc +28 -0
  217. data/src/core/lib/promise/wait_set.h +86 -0
  218. data/src/core/lib/resource_quota/arena.h +19 -0
  219. data/src/core/lib/slice/slice.h +5 -0
  220. data/src/core/lib/surface/channel_create.cc +88 -13
  221. data/src/core/lib/surface/channel_create.h +4 -0
  222. data/src/core/lib/surface/channel_init.cc +164 -47
  223. data/src/core/lib/surface/channel_init.h +64 -1
  224. data/src/core/lib/surface/filter_stack_call.cc +18 -9
  225. data/src/core/lib/surface/init.cc +6 -15
  226. data/src/core/lib/surface/legacy_channel.cc +3 -5
  227. data/src/core/lib/surface/legacy_channel.h +3 -1
  228. data/src/core/lib/surface/version.cc +2 -2
  229. data/src/core/lib/transport/promise_endpoint.cc +110 -0
  230. data/src/core/lib/transport/promise_endpoint.h +307 -0
  231. data/src/core/load_balancing/child_policy_handler.cc +2 -4
  232. data/src/core/load_balancing/delegating_helper.h +2 -3
  233. data/src/core/load_balancing/health_check_client.cc +1 -5
  234. data/src/core/load_balancing/lb_policy.h +1 -3
  235. data/src/core/load_balancing/oob_backend_metric.cc +1 -5
  236. data/src/core/load_balancing/pick_first/pick_first.cc +3 -0
  237. data/src/core/load_balancing/xds/cds.cc +10 -1
  238. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -0
  239. data/src/core/resolver/xds/xds_config.cc +6 -3
  240. data/src/core/resolver/xds/xds_config.h +9 -4
  241. data/src/core/resolver/xds/xds_dependency_manager.cc +21 -6
  242. data/src/core/resolver/xds/xds_dependency_manager.h +2 -1
  243. data/src/core/resolver/xds/xds_resolver.cc +31 -11
  244. data/src/core/server/server.cc +83 -12
  245. data/src/core/server/server.h +21 -2
  246. data/src/core/server/xds_server_config_fetcher.cc +63 -25
  247. data/src/core/service_config/service_config.h +1 -1
  248. data/src/core/service_config/service_config_impl.h +1 -1
  249. data/src/core/telemetry/context_list_entry.cc +38 -0
  250. data/src/core/telemetry/context_list_entry.h +42 -12
  251. data/src/core/telemetry/stats_data.cc +233 -207
  252. data/src/core/telemetry/stats_data.h +250 -153
  253. data/src/core/telemetry/tcp_tracer.h +1 -1
  254. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +11 -3
  255. data/src/core/tsi/fake_transport_security.cc +17 -0
  256. data/src/core/tsi/ssl_transport_security.cc +2 -0
  257. data/src/core/tsi/transport_security_grpc.cc +8 -0
  258. data/src/core/tsi/transport_security_grpc.h +15 -0
  259. data/src/core/util/backoff.cc +1 -5
  260. data/src/core/util/backoff.h +1 -0
  261. data/src/core/util/down_cast.h +1 -1
  262. data/src/core/util/function_signature.h +15 -1
  263. data/src/core/util/http_client/httpcli.cc +12 -5
  264. data/src/core/util/http_client/httpcli.h +4 -1
  265. data/src/core/util/latent_see.h +8 -5
  266. data/src/core/util/log.cc +4 -0
  267. data/src/core/util/memory_usage.h +268 -0
  268. data/src/core/util/per_cpu.cc +2 -0
  269. data/src/core/util/per_cpu.h +7 -0
  270. data/src/core/util/shared_bit_gen.h +20 -0
  271. data/src/core/util/single_set_ptr.h +2 -2
  272. data/src/core/util/upb_utils.h +42 -0
  273. data/src/core/util/uri.cc +3 -2
  274. data/src/core/util/useful.h +53 -2
  275. data/src/core/util/wait_for_single_owner.cc +31 -0
  276. data/src/core/util/wait_for_single_owner.h +24 -0
  277. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +2 -0
  278. data/src/core/xds/grpc/xds_bootstrap_grpc.h +5 -0
  279. data/src/core/xds/grpc/xds_client_grpc.cc +6 -2
  280. data/src/core/xds/grpc/xds_common_types_parser.cc +138 -50
  281. data/src/core/xds/grpc/xds_common_types_parser.h +12 -0
  282. data/src/core/xds/grpc/xds_http_filter.h +7 -0
  283. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +22 -0
  284. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +3 -0
  285. data/src/core/xds/grpc/xds_route_config_parser.cc +15 -38
  286. data/src/core/xds/grpc/xds_server_grpc.cc +63 -13
  287. data/src/core/xds/grpc/xds_server_grpc.h +10 -2
  288. data/src/core/xds/grpc/xds_server_grpc_interface.h +4 -0
  289. data/src/core/xds/grpc/xds_transport_grpc.cc +18 -0
  290. data/src/core/xds/xds_client/xds_bootstrap.h +2 -0
  291. data/src/core/xds/xds_client/xds_client.cc +26 -5
  292. data/src/ruby/ext/grpc/extconf.rb +2 -0
  293. data/src/ruby/ext/grpc/rb_call.c +1 -8
  294. data/src/ruby/ext/grpc/rb_channel.c +72 -568
  295. data/src/ruby/ext/grpc/rb_channel.h +0 -3
  296. data/src/ruby/ext/grpc/rb_completion_queue.c +26 -14
  297. data/src/ruby/ext/grpc/rb_completion_queue.h +1 -7
  298. data/src/ruby/ext/grpc/rb_grpc.c +9 -5
  299. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  300. data/src/ruby/ext/grpc/rb_loader.c +0 -4
  301. data/src/ruby/ext/grpc/rb_server.c +31 -50
  302. data/src/ruby/lib/grpc/generic/client_stub.rb +4 -4
  303. data/src/ruby/lib/grpc/version.rb +1 -1
  304. data/src/ruby/spec/core_spec.rb +22 -0
  305. data/src/ruby/spec/generic/active_call_spec.rb +1 -1
  306. data/third_party/abseil-cpp/absl/algorithm/container.h +2 -19
  307. data/third_party/abseil-cpp/absl/base/attributes.h +76 -7
  308. data/third_party/abseil-cpp/absl/base/call_once.h +11 -12
  309. data/third_party/abseil-cpp/absl/base/config.h +20 -129
  310. data/third_party/abseil-cpp/absl/base/{internal/fast_type_id.h → fast_type_id.h} +11 -16
  311. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +0 -5
  312. data/third_party/abseil-cpp/absl/base/internal/cycleclock_config.h +7 -7
  313. data/third_party/abseil-cpp/absl/base/internal/endian.h +34 -38
  314. data/third_party/abseil-cpp/absl/base/internal/iterator_traits.h +71 -0
  315. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +6 -5
  316. data/third_party/abseil-cpp/absl/base/internal/{nullability_impl.h → nullability_deprecated.h} +45 -8
  317. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +0 -9
  318. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -13
  319. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +6 -6
  320. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +8 -3
  321. data/third_party/abseil-cpp/absl/base/no_destructor.h +11 -32
  322. data/third_party/abseil-cpp/absl/base/nullability.h +84 -72
  323. data/third_party/abseil-cpp/absl/base/options.h +3 -80
  324. data/third_party/abseil-cpp/absl/base/policy_checks.h +7 -7
  325. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +1 -3
  326. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -4
  327. data/third_party/abseil-cpp/absl/container/btree_map.h +4 -2
  328. data/third_party/abseil-cpp/absl/container/btree_set.h +4 -2
  329. data/third_party/abseil-cpp/absl/container/fixed_array.h +7 -14
  330. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +5 -0
  331. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +6 -1
  332. data/third_party/abseil-cpp/absl/container/inlined_vector.h +8 -5
  333. data/third_party/abseil-cpp/absl/container/internal/btree.h +132 -29
  334. data/third_party/abseil-cpp/absl/container/internal/btree_container.h +175 -71
  335. data/third_party/abseil-cpp/absl/container/internal/common.h +43 -0
  336. data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -2
  337. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +9 -10
  338. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +1 -8
  339. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +0 -4
  340. data/third_party/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +527 -0
  341. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +20 -4
  342. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +31 -12
  343. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +2 -7
  344. data/third_party/abseil-cpp/absl/container/internal/layout.h +26 -42
  345. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +199 -68
  346. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +1354 -183
  347. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +881 -1424
  348. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +80 -0
  349. data/third_party/abseil-cpp/absl/crc/crc32c.cc +0 -4
  350. data/third_party/abseil-cpp/absl/crc/crc32c.h +7 -5
  351. data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +0 -22
  352. data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +45 -74
  353. data/third_party/abseil-cpp/absl/debugging/internal/addresses.h +57 -0
  354. data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.cc +1 -1
  355. data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.h +5 -5
  356. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +8 -35
  357. data/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.cc +16 -16
  358. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +40 -37
  359. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +16 -7
  360. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +14 -5
  361. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +10 -4
  362. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +27 -16
  363. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +13 -4
  364. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +4 -3
  365. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +15 -28
  366. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +19 -9
  367. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +144 -27
  368. data/third_party/abseil-cpp/absl/debugging/stacktrace.h +73 -5
  369. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +19 -9
  370. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +3 -2
  371. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +25 -6
  372. data/third_party/abseil-cpp/absl/flags/commandlineflag.h +2 -2
  373. data/third_party/abseil-cpp/absl/flags/flag.h +4 -3
  374. data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h +2 -2
  375. data/third_party/abseil-cpp/absl/flags/internal/flag.cc +2 -1
  376. data/third_party/abseil-cpp/absl/flags/internal/flag.h +7 -6
  377. data/third_party/abseil-cpp/absl/flags/internal/registry.h +4 -3
  378. data/third_party/abseil-cpp/absl/flags/reflection.cc +2 -3
  379. data/third_party/abseil-cpp/absl/functional/any_invocable.h +8 -10
  380. data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -9
  381. data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +110 -226
  382. data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +10 -12
  383. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +2 -5
  384. data/third_party/abseil-cpp/absl/hash/hash.h +18 -0
  385. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +1 -5
  386. data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -61
  387. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +25 -68
  388. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.h +2 -6
  389. data/third_party/abseil-cpp/absl/hash/internal/weakly_mixed_integer.h +38 -0
  390. data/third_party/abseil-cpp/absl/log/check.h +2 -1
  391. data/third_party/abseil-cpp/absl/log/globals.h +4 -5
  392. data/third_party/abseil-cpp/absl/log/internal/append_truncated.h +28 -0
  393. data/third_party/abseil-cpp/absl/log/internal/check_op.cc +22 -22
  394. data/third_party/abseil-cpp/absl/log/internal/check_op.h +65 -62
  395. data/third_party/abseil-cpp/absl/log/internal/conditions.cc +5 -3
  396. data/third_party/abseil-cpp/absl/log/internal/conditions.h +7 -2
  397. data/third_party/abseil-cpp/absl/log/internal/log_message.cc +85 -43
  398. data/third_party/abseil-cpp/absl/log/internal/log_message.h +84 -59
  399. data/third_party/abseil-cpp/absl/log/internal/nullstream.h +1 -0
  400. data/third_party/abseil-cpp/absl/log/internal/proto.cc +3 -2
  401. data/third_party/abseil-cpp/absl/log/internal/proto.h +3 -3
  402. data/third_party/abseil-cpp/absl/log/internal/strip.h +4 -12
  403. data/third_party/abseil-cpp/absl/log/internal/vlog_config.h +8 -6
  404. data/third_party/abseil-cpp/absl/log/internal/voidify.h +10 -4
  405. data/third_party/abseil-cpp/absl/log/log.h +48 -35
  406. data/third_party/abseil-cpp/absl/log/log_sink_registry.h +2 -2
  407. data/third_party/abseil-cpp/absl/meta/type_traits.h +46 -175
  408. data/third_party/abseil-cpp/absl/numeric/bits.h +68 -2
  409. data/third_party/abseil-cpp/absl/numeric/int128.cc +0 -52
  410. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +7 -3
  411. data/third_party/abseil-cpp/absl/profiling/internal/exponential_biased.cc +1 -1
  412. data/third_party/abseil-cpp/absl/random/bit_gen_ref.h +10 -11
  413. data/third_party/abseil-cpp/absl/random/distributions.h +6 -8
  414. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +1 -1
  415. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +5 -6
  416. data/third_party/abseil-cpp/absl/random/internal/{pool_urbg.cc → entropy_pool.cc} +22 -90
  417. data/third_party/abseil-cpp/absl/random/internal/entropy_pool.h +35 -0
  418. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +5 -6
  419. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +1 -1
  420. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +20 -12
  421. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +5 -5
  422. data/third_party/abseil-cpp/absl/random/random.h +88 -53
  423. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +6 -2
  424. data/third_party/abseil-cpp/absl/status/internal/status_internal.cc +3 -4
  425. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +3 -4
  426. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -3
  427. data/third_party/abseil-cpp/absl/status/status.cc +4 -8
  428. data/third_party/abseil-cpp/absl/status/status.h +8 -8
  429. data/third_party/abseil-cpp/absl/status/status_payload_printer.h +2 -2
  430. data/third_party/abseil-cpp/absl/status/statusor.cc +2 -2
  431. data/third_party/abseil-cpp/absl/status/statusor.h +6 -6
  432. data/third_party/abseil-cpp/absl/strings/ascii.cc +9 -9
  433. data/third_party/abseil-cpp/absl/strings/ascii.h +18 -18
  434. data/third_party/abseil-cpp/absl/strings/charconv.cc +21 -22
  435. data/third_party/abseil-cpp/absl/strings/charconv.h +5 -5
  436. data/third_party/abseil-cpp/absl/strings/cord.cc +54 -58
  437. data/third_party/abseil-cpp/absl/strings/cord.h +94 -83
  438. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +11 -11
  439. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +3 -3
  440. data/third_party/abseil-cpp/absl/strings/escaping.cc +130 -149
  441. data/third_party/abseil-cpp/absl/strings/escaping.h +9 -10
  442. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
  443. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +6 -8
  444. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +0 -4
  445. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +0 -4
  446. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +7 -63
  447. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -11
  448. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +0 -22
  449. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.cc +5 -3
  450. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
  451. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +3 -3
  452. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +0 -5
  453. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +96 -1
  454. data/third_party/abseil-cpp/absl/strings/internal/utf8.h +15 -1
  455. data/third_party/abseil-cpp/absl/strings/numbers.cc +53 -32
  456. data/third_party/abseil-cpp/absl/strings/numbers.h +87 -58
  457. data/third_party/abseil-cpp/absl/strings/str_cat.cc +6 -7
  458. data/third_party/abseil-cpp/absl/strings/str_cat.h +32 -32
  459. data/third_party/abseil-cpp/absl/strings/str_format.h +18 -18
  460. data/third_party/abseil-cpp/absl/strings/str_replace.cc +3 -3
  461. data/third_party/abseil-cpp/absl/strings/str_replace.h +6 -6
  462. data/third_party/abseil-cpp/absl/strings/string_view.cc +4 -9
  463. data/third_party/abseil-cpp/absl/strings/string_view.h +27 -32
  464. data/third_party/abseil-cpp/absl/strings/strip.h +4 -4
  465. data/third_party/abseil-cpp/absl/strings/substitute.cc +5 -4
  466. data/third_party/abseil-cpp/absl/strings/substitute.h +66 -64
  467. data/third_party/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +0 -4
  468. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +0 -5
  469. data/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +0 -4
  470. data/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +0 -4
  471. data/third_party/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +0 -4
  472. data/third_party/abseil-cpp/absl/synchronization/internal/waiter_base.cc +0 -4
  473. data/third_party/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +0 -4
  474. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +1 -1
  475. data/third_party/abseil-cpp/absl/synchronization/mutex.h +97 -69
  476. data/third_party/abseil-cpp/absl/synchronization/notification.h +1 -1
  477. data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -0
  478. data/third_party/abseil-cpp/absl/time/duration.cc +12 -7
  479. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +1 -1
  480. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +90 -111
  481. data/third_party/abseil-cpp/absl/time/time.h +20 -15
  482. data/third_party/abseil-cpp/absl/types/optional.h +7 -747
  483. data/third_party/abseil-cpp/absl/types/span.h +13 -11
  484. data/third_party/abseil-cpp/absl/types/variant.h +5 -784
  485. data/third_party/abseil-cpp/absl/utility/utility.h +10 -185
  486. metadata +72 -20
  487. data/src/core/lib/event_engine/forkable.cc +0 -105
  488. data/src/core/lib/event_engine/forkable.h +0 -67
  489. data/src/core/lib/iomgr/python_util.h +0 -46
  490. data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +0 -108
  491. data/third_party/abseil-cpp/absl/base/internal/invoke.h +0 -241
  492. data/third_party/abseil-cpp/absl/log/log_entry.cc +0 -41
  493. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +0 -131
  494. data/third_party/abseil-cpp/absl/types/bad_optional_access.cc +0 -66
  495. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +0 -78
  496. data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +0 -82
  497. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +0 -82
  498. data/third_party/abseil-cpp/absl/types/internal/optional.h +0 -352
  499. data/third_party/abseil-cpp/absl/types/internal/variant.h +0 -1622
@@ -0,0 +1,31 @@
1
+ // Copyright 2025 The gRPC Authors
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include "src/core/util/wait_for_single_owner.h"
16
+
17
+ #include "src/core/util/no_destruct.h"
18
+
19
+ namespace grpc_core {
20
+
21
+ NoDestruct<absl::AnyInvocable<void()>> cb_{nullptr};
22
+
23
+ void SetWaitForSingleOwnerStalledCallback(absl::AnyInvocable<void()> cb) {
24
+ *cb_ = std::move(cb);
25
+ }
26
+
27
+ void WaitForSingleOwnerStalled() {
28
+ if (*cb_ != nullptr) (*cb_)();
29
+ }
30
+
31
+ } // namespace grpc_core
@@ -17,12 +17,23 @@
17
17
 
18
18
  #include <memory>
19
19
 
20
+ #include "absl/functional/any_invocable.h"
20
21
  #include "absl/log/log.h"
21
22
  #include "src/core/util/crash.h"
22
23
  #include "src/core/util/time.h"
23
24
 
24
25
  namespace grpc_core {
25
26
 
27
+ constexpr Duration kWaitForSingleOwnerStallCheckFrequency =
28
+ Duration::Seconds(10);
29
+
30
+ // Provide a function that WaitForSingleOwner will call when it appears to have
31
+ // stalled.
32
+ void SetWaitForSingleOwnerStalledCallback(absl::AnyInvocable<void()> cb);
33
+
34
+ // INTERNAL: Call the stall callback.
35
+ void WaitForSingleOwnerStalled();
36
+
26
37
  // Waits until the use_count of the shared_ptr has reached 1 and returns,
27
38
  // destroying the object.
28
39
  //
@@ -41,8 +52,21 @@ void WaitForSingleOwner(std::shared_ptr<T> obj) {
41
52
  template <typename T>
42
53
  void WaitForSingleOwnerWithTimeout(std::shared_ptr<T> obj, Duration timeout) {
43
54
  auto start = Timestamp::Now();
55
+ size_t last_check_period = 0;
56
+ bool reported_stall = false;
44
57
  while (obj.use_count() > 1) {
45
58
  auto elapsed = Timestamp::Now() - start;
59
+ if (size_t current_check_period =
60
+ elapsed.seconds() /
61
+ kWaitForSingleOwnerStallCheckFrequency.seconds();
62
+ current_check_period > last_check_period) {
63
+ ++last_check_period;
64
+ if (!reported_stall) {
65
+ LOG(INFO) << "Investigating stall...";
66
+ WaitForSingleOwnerStalled();
67
+ reported_stall = true;
68
+ }
69
+ }
46
70
  auto remaining = timeout - elapsed;
47
71
  if (remaining < Duration::Zero()) {
48
72
  Crash("Timed out waiting for a single shared_ptr owner");
@@ -84,6 +84,8 @@ const JsonLoaderInterface* GrpcXdsBootstrap::GrpcAuthority::JsonLoader(
84
84
  "client_listener_resource_name_template",
85
85
  &GrpcAuthority::client_listener_resource_name_template_)
86
86
  .OptionalField("xds_servers", &GrpcAuthority::servers_)
87
+ .OptionalField("fallback_on_reachability_only",
88
+ &GrpcAuthority::fallback_on_reachability_only_)
87
89
  .Finish();
88
90
  return loader;
89
91
  }
@@ -85,6 +85,10 @@ class GrpcXdsBootstrap final : public XdsBootstrap {
85
85
  return servers;
86
86
  }
87
87
 
88
+ bool FallbackOnReachabilityOnly() const override {
89
+ return fallback_on_reachability_only_;
90
+ }
91
+
88
92
  const std::string& client_listener_resource_name_template() const {
89
93
  return client_listener_resource_name_template_;
90
94
  }
@@ -94,6 +98,7 @@ class GrpcXdsBootstrap final : public XdsBootstrap {
94
98
  private:
95
99
  std::vector<GrpcXdsServer> servers_;
96
100
  std::string client_listener_resource_name_template_;
101
+ bool fallback_on_reachability_only_;
97
102
  };
98
103
 
99
104
  // Creates bootstrap object from json_string.
@@ -251,6 +251,8 @@ absl::StatusOr<RefCountedPtr<GrpcXdsClient>> GrpcXdsClient::GetOrCreate(
251
251
  std::optional<absl::string_view> bootstrap_config = args.GetString(
252
252
  GRPC_ARG_TEST_ONLY_DO_NOT_USE_IN_PROD_XDS_BOOTSTRAP_CONFIG);
253
253
  if (bootstrap_config.has_value()) {
254
+ GRPC_TRACE_LOG(xds_client, INFO)
255
+ << "xDS bootstrap contents: " << *bootstrap_config;
254
256
  auto bootstrap = GrpcXdsBootstrap::Create(*bootstrap_config);
255
257
  if (!bootstrap.ok()) return bootstrap.status();
256
258
  grpc_channel_args* xds_channel_args = args.GetPointer<grpc_channel_args>(
@@ -261,7 +263,8 @@ absl::StatusOr<RefCountedPtr<GrpcXdsClient>> GrpcXdsClient::GetOrCreate(
261
263
  MakeRefCounted<GrpcXdsTransportFactory>(channel_args),
262
264
  GetStatsPluginGroupForKeyAndChannelArgs(key, args));
263
265
  }
264
- // Otherwise, use the global instance.
266
+ // Otherwise, check the global map to see if the XdsClient instance
267
+ // for this key already exists.
265
268
  MutexLock lock(g_mu);
266
269
  auto it = g_xds_client_map->find(key);
267
270
  if (it != g_xds_client_map->end()) {
@@ -270,7 +273,8 @@ absl::StatusOr<RefCountedPtr<GrpcXdsClient>> GrpcXdsClient::GetOrCreate(
270
273
  return xds_client.TakeAsSubclass<GrpcXdsClient>();
271
274
  }
272
275
  }
273
- // Find bootstrap contents.
276
+ // It doesn't exist, so we'll create it.
277
+ // First, find bootstrap contents.
274
278
  auto bootstrap_contents = GetBootstrapContents(g_fallback_bootstrap_config);
275
279
  if (!bootstrap_contents.ok()) return bootstrap_contents.status();
276
280
  GRPC_TRACE_LOG(xds_client, INFO)
@@ -33,7 +33,6 @@
33
33
  #include "envoy/extensions/transport_sockets/tls/v3/common.upb.h"
34
34
  #include "envoy/extensions/transport_sockets/tls/v3/tls.upb.h"
35
35
  #include "envoy/type/matcher/v3/regex.upb.h"
36
- #include "envoy/type/matcher/v3/string.upb.h"
37
36
  #include "google/protobuf/any.upb.h"
38
37
  #include "google/protobuf/struct.upb.h"
39
38
  #include "google/protobuf/struct.upbdefs.h"
@@ -48,6 +47,7 @@
48
47
  #include "upb/base/status.hpp"
49
48
  #include "upb/json/encode.h"
50
49
  #include "upb/mem/arena.h"
50
+ #include "xds/type/matcher/v3/regex.upb.h"
51
51
  #include "xds/type/v3/typed_struct.upb.h"
52
52
 
53
53
  namespace grpc_core {
@@ -107,6 +107,140 @@ std::optional<grpc_resolved_address> ParseXdsAddress(
107
107
  return *addr;
108
108
  }
109
109
 
110
+ //
111
+ // StringMatcherParse()
112
+ //
113
+
114
+ namespace {
115
+
116
+ class StringMatcherProtoAccessor {
117
+ public:
118
+ virtual ~StringMatcherProtoAccessor() = default;
119
+
120
+ virtual bool IsPresent() const = 0;
121
+ virtual bool HasExact() const = 0;
122
+ virtual upb_StringView GetExact() const = 0;
123
+ virtual bool HasPrefix() const = 0;
124
+ virtual upb_StringView GetPrefix() const = 0;
125
+ virtual bool HasSuffix() const = 0;
126
+ virtual upb_StringView GetSuffix() const = 0;
127
+ virtual bool HasContains() const = 0;
128
+ virtual upb_StringView GetContains() const = 0;
129
+ virtual bool HasSafeRegex() const = 0;
130
+ virtual upb_StringView GetSafeRegex() const = 0;
131
+ virtual bool IgnoreCase() const = 0;
132
+ };
133
+
134
+ #define GRPC_STRING_MATCHER_PROTO_ACCESSOR_CLASS(prefix) \
135
+ class ProtoAccessor final : public StringMatcherProtoAccessor { \
136
+ public: \
137
+ explicit ProtoAccessor( \
138
+ const prefix##_type_matcher_v3_StringMatcher* proto) \
139
+ : proto_(proto) {} \
140
+ \
141
+ bool IsPresent() const override { return proto_ != nullptr; } \
142
+ bool HasExact() const override { \
143
+ return prefix##_type_matcher_v3_StringMatcher_has_exact(proto_); \
144
+ } \
145
+ upb_StringView GetExact() const override { \
146
+ return prefix##_type_matcher_v3_StringMatcher_exact(proto_); \
147
+ } \
148
+ bool HasPrefix() const override { \
149
+ return prefix##_type_matcher_v3_StringMatcher_has_prefix(proto_); \
150
+ } \
151
+ upb_StringView GetPrefix() const override { \
152
+ return prefix##_type_matcher_v3_StringMatcher_prefix(proto_); \
153
+ } \
154
+ bool HasSuffix() const override { \
155
+ return prefix##_type_matcher_v3_StringMatcher_has_suffix(proto_); \
156
+ } \
157
+ upb_StringView GetSuffix() const override { \
158
+ return prefix##_type_matcher_v3_StringMatcher_suffix(proto_); \
159
+ } \
160
+ bool HasContains() const override { \
161
+ return prefix##_type_matcher_v3_StringMatcher_has_contains(proto_); \
162
+ } \
163
+ upb_StringView GetContains() const override { \
164
+ return prefix##_type_matcher_v3_StringMatcher_contains(proto_); \
165
+ } \
166
+ bool HasSafeRegex() const override { \
167
+ return prefix##_type_matcher_v3_StringMatcher_has_safe_regex(proto_); \
168
+ } \
169
+ upb_StringView GetSafeRegex() const override { \
170
+ auto* regex_matcher = \
171
+ prefix##_type_matcher_v3_StringMatcher_safe_regex(proto_); \
172
+ return prefix##_type_matcher_v3_RegexMatcher_regex(regex_matcher); \
173
+ } \
174
+ bool IgnoreCase() const override { \
175
+ return prefix##_type_matcher_v3_StringMatcher_ignore_case(proto_); \
176
+ } \
177
+ \
178
+ private: \
179
+ const prefix##_type_matcher_v3_StringMatcher* proto_; \
180
+ };
181
+
182
+ StringMatcher StringMatcherParseInternal(
183
+ const StringMatcherProtoAccessor& proto, ValidationErrors* errors) {
184
+ if (!proto.IsPresent()) {
185
+ errors->AddError("field not present");
186
+ return StringMatcher();
187
+ }
188
+ StringMatcher::Type type;
189
+ std::string matcher;
190
+ if (proto.HasExact()) {
191
+ type = StringMatcher::Type::kExact;
192
+ matcher = UpbStringToStdString(proto.GetExact());
193
+ } else if (proto.HasPrefix()) {
194
+ type = StringMatcher::Type::kPrefix;
195
+ matcher = UpbStringToStdString(proto.GetPrefix());
196
+ } else if (proto.HasSuffix()) {
197
+ type = StringMatcher::Type::kSuffix;
198
+ matcher = UpbStringToStdString(proto.GetSuffix());
199
+ } else if (proto.HasContains()) {
200
+ type = StringMatcher::Type::kContains;
201
+ matcher = UpbStringToStdString(proto.GetContains());
202
+ } else if (proto.HasSafeRegex()) {
203
+ type = StringMatcher::Type::kSafeRegex;
204
+ matcher = UpbStringToStdString(proto.GetSafeRegex());
205
+ } else {
206
+ errors->AddError("invalid string matcher");
207
+ return StringMatcher();
208
+ }
209
+ const bool ignore_case = proto.IgnoreCase();
210
+ absl::StatusOr<StringMatcher> string_matcher =
211
+ StringMatcher::Create(type, matcher,
212
+ /*case_sensitive=*/!ignore_case);
213
+ if (!string_matcher.ok()) {
214
+ errors->AddError(string_matcher.status().message());
215
+ return StringMatcher();
216
+ }
217
+ if (type == StringMatcher::Type::kSafeRegex && ignore_case) {
218
+ ValidationErrors::ScopedField field(errors, ".ignore_case");
219
+ errors->AddError("not supported for regex matcher");
220
+ }
221
+ return std::move(*string_matcher);
222
+ }
223
+
224
+ } // namespace
225
+
226
+ StringMatcher StringMatcherParse(
227
+ const XdsResourceType::DecodeContext& /*context*/,
228
+ const envoy_type_matcher_v3_StringMatcher* matcher_proto,
229
+ ValidationErrors* errors) {
230
+ GRPC_STRING_MATCHER_PROTO_ACCESSOR_CLASS(envoy);
231
+ ProtoAccessor proto_accessor(matcher_proto);
232
+ return StringMatcherParseInternal(proto_accessor, errors);
233
+ }
234
+
235
+ StringMatcher StringMatcherParse(
236
+ const XdsResourceType::DecodeContext& /*context*/,
237
+ const xds_type_matcher_v3_StringMatcher* matcher_proto,
238
+ ValidationErrors* errors) {
239
+ GRPC_STRING_MATCHER_PROTO_ACCESSOR_CLASS(xds);
240
+ ProtoAccessor proto_accessor(matcher_proto);
241
+ return StringMatcherParseInternal(proto_accessor, errors);
242
+ }
243
+
110
244
  //
111
245
  // CommonTlsContextParse()
112
246
  //
@@ -182,56 +316,10 @@ CertificateValidationContextParse(
182
316
  for (size_t i = 0; i < len; ++i) {
183
317
  ValidationErrors::ScopedField field(
184
318
  errors, absl::StrCat(".match_subject_alt_names[", i, "]"));
185
- StringMatcher::Type type;
186
- std::string matcher;
187
- if (envoy_type_matcher_v3_StringMatcher_has_exact(
188
- subject_alt_names_matchers[i])) {
189
- type = StringMatcher::Type::kExact;
190
- matcher = UpbStringToStdString(envoy_type_matcher_v3_StringMatcher_exact(
191
- subject_alt_names_matchers[i]));
192
- } else if (envoy_type_matcher_v3_StringMatcher_has_prefix(
193
- subject_alt_names_matchers[i])) {
194
- type = StringMatcher::Type::kPrefix;
195
- matcher = UpbStringToStdString(envoy_type_matcher_v3_StringMatcher_prefix(
196
- subject_alt_names_matchers[i]));
197
- } else if (envoy_type_matcher_v3_StringMatcher_has_suffix(
198
- subject_alt_names_matchers[i])) {
199
- type = StringMatcher::Type::kSuffix;
200
- matcher = UpbStringToStdString(envoy_type_matcher_v3_StringMatcher_suffix(
201
- subject_alt_names_matchers[i]));
202
- } else if (envoy_type_matcher_v3_StringMatcher_has_contains(
203
- subject_alt_names_matchers[i])) {
204
- type = StringMatcher::Type::kContains;
205
- matcher =
206
- UpbStringToStdString(envoy_type_matcher_v3_StringMatcher_contains(
207
- subject_alt_names_matchers[i]));
208
- } else if (envoy_type_matcher_v3_StringMatcher_has_safe_regex(
209
- subject_alt_names_matchers[i])) {
210
- type = StringMatcher::Type::kSafeRegex;
211
- auto* regex_matcher = envoy_type_matcher_v3_StringMatcher_safe_regex(
212
- subject_alt_names_matchers[i]);
213
- matcher = UpbStringToStdString(
214
- envoy_type_matcher_v3_RegexMatcher_regex(regex_matcher));
215
- } else {
216
- errors->AddError("invalid StringMatcher specified");
217
- continue;
218
- }
219
- bool ignore_case = envoy_type_matcher_v3_StringMatcher_ignore_case(
220
- subject_alt_names_matchers[i]);
221
- absl::StatusOr<StringMatcher> string_matcher =
222
- StringMatcher::Create(type, matcher,
223
- /*case_sensitive=*/!ignore_case);
224
- if (!string_matcher.ok()) {
225
- errors->AddError(string_matcher.status().message());
226
- continue;
227
- }
228
- if (type == StringMatcher::Type::kSafeRegex && ignore_case) {
229
- ValidationErrors::ScopedField field(errors, ".ignore_case");
230
- errors->AddError("not supported for regex matcher");
231
- continue;
232
- }
319
+ auto string_matcher =
320
+ StringMatcherParse(context, subject_alt_names_matchers[i], errors);
233
321
  certificate_validation_context.match_subject_alt_names.push_back(
234
- std::move(string_matcher.value()));
322
+ std::move(string_matcher));
235
323
  }
236
324
  auto* ca_certificate_provider_instance =
237
325
  envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_ca_certificate_provider_instance(
@@ -21,15 +21,18 @@
21
21
 
22
22
  #include "envoy/config/core/v3/base.upb.h"
23
23
  #include "envoy/extensions/transport_sockets/tls/v3/tls.upb.h"
24
+ #include "envoy/type/matcher/v3/string.upb.h"
24
25
  #include "google/protobuf/any.upb.h"
25
26
  #include "google/protobuf/duration.upb.h"
26
27
  #include "google/protobuf/struct.upb.h"
27
28
  #include "google/protobuf/wrappers.upb.h"
28
29
  #include "src/core/lib/iomgr/resolved_address.h"
30
+ #include "src/core/util/matchers.h"
29
31
  #include "src/core/util/time.h"
30
32
  #include "src/core/util/validation_errors.h"
31
33
  #include "src/core/xds/grpc/xds_common_types.h"
32
34
  #include "src/core/xds/xds_client/xds_resource_type.h"
35
+ #include "xds/type/matcher/v3/string.upb.h"
33
36
 
34
37
  namespace grpc_core {
35
38
 
@@ -58,6 +61,15 @@ inline std::optional<uint32_t> ParseUInt32Value(
58
61
  std::optional<grpc_resolved_address> ParseXdsAddress(
59
62
  const envoy_config_core_v3_Address* address, ValidationErrors* errors);
60
63
 
64
+ StringMatcher StringMatcherParse(
65
+ const XdsResourceType::DecodeContext& context,
66
+ const envoy_type_matcher_v3_StringMatcher* matcher_proto,
67
+ ValidationErrors* errors);
68
+ StringMatcher StringMatcherParse(
69
+ const XdsResourceType::DecodeContext& context,
70
+ const xds_type_matcher_v3_StringMatcher* matcher_proto,
71
+ ValidationErrors* errors);
72
+
61
73
  CommonTlsContext CommonTlsContextParse(
62
74
  const XdsResourceType::DecodeContext& context,
63
75
  const envoy_extensions_transport_sockets_tls_v3_CommonTlsContext*
@@ -24,6 +24,7 @@
24
24
  #include "absl/strings/str_cat.h"
25
25
  #include "absl/strings/string_view.h"
26
26
  #include "src/core/call/interception_chain.h"
27
+ #include "src/core/filter/blackboard.h"
27
28
  #include "src/core/lib/channel/channel_args.h"
28
29
  #include "src/core/lib/channel/channel_fwd.h"
29
30
  #include "src/core/util/json/json.h"
@@ -119,6 +120,12 @@ class XdsHttpFilterImpl {
119
120
  virtual absl::StatusOr<ServiceConfigJsonEntry> GenerateServiceConfig(
120
121
  const FilterConfig& hcm_filter_config) const = 0;
121
122
 
123
+ // Adds state to new_blackboard if needed for the specified filter
124
+ // config. Copies existing state from old_blackboard as appropriate.
125
+ virtual void UpdateBlackboard(const FilterConfig& /*hcm_filter_config*/,
126
+ const Blackboard* /*old_blackboard*/,
127
+ Blackboard* /*new_blackboard*/) const {}
128
+
122
129
  // Returns true if the filter is supported on clients; false otherwise
123
130
  virtual bool IsSupportedOnClients() const = 0;
124
131
 
@@ -138,4 +138,26 @@ XdsHttpGcpAuthnFilter::GenerateServiceConfig(
138
138
  JsonDump(hcm_filter_config.config)};
139
139
  }
140
140
 
141
+ void XdsHttpGcpAuthnFilter::UpdateBlackboard(
142
+ const FilterConfig& hcm_filter_config, const Blackboard* old_blackboard,
143
+ Blackboard* new_blackboard) const {
144
+ ValidationErrors errors;
145
+ auto config = LoadFromJson<GcpAuthenticationParsedConfig::Config>(
146
+ hcm_filter_config.config, JsonArgs(), &errors);
147
+ CHECK(errors.ok()) << errors.message("filter config validation failed");
148
+ RefCountedPtr<GcpAuthenticationFilter::CallCredentialsCache> cache;
149
+ if (old_blackboard != nullptr) {
150
+ cache = old_blackboard->Get<GcpAuthenticationFilter::CallCredentialsCache>(
151
+ config.filter_instance_name);
152
+ }
153
+ if (cache != nullptr) {
154
+ cache->SetMaxSize(config.cache_size);
155
+ } else {
156
+ cache = MakeRefCounted<GcpAuthenticationFilter::CallCredentialsCache>(
157
+ config.cache_size);
158
+ }
159
+ CHECK_NE(new_blackboard, nullptr);
160
+ new_blackboard->Set(config.filter_instance_name, std::move(cache));
161
+ }
162
+
141
163
  } // namespace grpc_core
@@ -52,6 +52,9 @@ class XdsHttpGcpAuthnFilter final : public XdsHttpFilterImpl {
52
52
  const FilterConfig* filter_config_override) const override;
53
53
  absl::StatusOr<ServiceConfigJsonEntry> GenerateServiceConfig(
54
54
  const FilterConfig& hcm_filter_config) const override;
55
+ void UpdateBlackboard(const FilterConfig& hcm_filter_config,
56
+ const Blackboard* old_blackboard,
57
+ Blackboard* new_blackboard) const override;
55
58
  bool IsSupportedOnClients() const override { return true; }
56
59
  bool IsSupportedOnServers() const override { return false; }
57
60
  };
@@ -237,7 +237,8 @@ std::optional<StringMatcher> RoutePathMatchParse(
237
237
  return std::move(*string_matcher);
238
238
  }
239
239
 
240
- void RouteHeaderMatchersParse(const envoy_config_route_v3_RouteMatch* match,
240
+ void RouteHeaderMatchersParse(const XdsResourceType::DecodeContext& context,
241
+ const envoy_config_route_v3_RouteMatch* match,
241
242
  XdsRouteConfigResource::Route* route,
242
243
  ValidationErrors* errors) {
243
244
  size_t size;
@@ -250,6 +251,18 @@ void RouteHeaderMatchersParse(const envoy_config_route_v3_RouteMatch* match,
250
251
  CHECK_NE(header, nullptr);
251
252
  const std::string name =
252
253
  UpbStringToStdString(envoy_config_route_v3_HeaderMatcher_name(header));
254
+ const bool invert_match =
255
+ envoy_config_route_v3_HeaderMatcher_invert_match(header);
256
+ if (envoy_config_route_v3_HeaderMatcher_has_string_match(header)) {
257
+ ValidationErrors::ScopedField field(errors, ".string_match");
258
+ auto string_matcher = StringMatcherParse(
259
+ context, envoy_config_route_v3_HeaderMatcher_string_match(header),
260
+ errors);
261
+ route->matchers.header_matchers.emplace_back(
262
+ HeaderMatcher::CreateFromStringMatcher(
263
+ name, std::move(string_matcher), invert_match));
264
+ continue;
265
+ }
253
266
  HeaderMatcher::Type type;
254
267
  std::string match_string;
255
268
  int64_t range_start = 0;
@@ -290,46 +303,10 @@ void RouteHeaderMatchersParse(const envoy_config_route_v3_RouteMatch* match,
290
303
  } else if (envoy_config_route_v3_HeaderMatcher_has_present_match(header)) {
291
304
  type = HeaderMatcher::Type::kPresent;
292
305
  present_match = envoy_config_route_v3_HeaderMatcher_present_match(header);
293
- } else if (envoy_config_route_v3_HeaderMatcher_has_string_match(header)) {
294
- ValidationErrors::ScopedField field(errors, ".string_match");
295
- const auto* matcher =
296
- envoy_config_route_v3_HeaderMatcher_string_match(header);
297
- CHECK_NE(matcher, nullptr);
298
- if (envoy_type_matcher_v3_StringMatcher_has_exact(matcher)) {
299
- type = HeaderMatcher::Type::kExact;
300
- match_string = UpbStringToStdString(
301
- envoy_type_matcher_v3_StringMatcher_exact(matcher));
302
- } else if (envoy_type_matcher_v3_StringMatcher_has_prefix(matcher)) {
303
- type = HeaderMatcher::Type::kPrefix;
304
- match_string = UpbStringToStdString(
305
- envoy_type_matcher_v3_StringMatcher_prefix(matcher));
306
- } else if (envoy_type_matcher_v3_StringMatcher_has_suffix(matcher)) {
307
- type = HeaderMatcher::Type::kSuffix;
308
- match_string = UpbStringToStdString(
309
- envoy_type_matcher_v3_StringMatcher_suffix(matcher));
310
- } else if (envoy_type_matcher_v3_StringMatcher_has_contains(matcher)) {
311
- type = HeaderMatcher::Type::kContains;
312
- match_string = UpbStringToStdString(
313
- envoy_type_matcher_v3_StringMatcher_contains(matcher));
314
- } else if (envoy_type_matcher_v3_StringMatcher_has_safe_regex(matcher)) {
315
- type = HeaderMatcher::Type::kSafeRegex;
316
- const auto* regex_matcher =
317
- envoy_type_matcher_v3_StringMatcher_safe_regex(matcher);
318
- CHECK_NE(regex_matcher, nullptr);
319
- match_string = UpbStringToStdString(
320
- envoy_type_matcher_v3_RegexMatcher_regex(regex_matcher));
321
- } else {
322
- errors->AddError("invalid string matcher");
323
- continue;
324
- }
325
- case_sensitive =
326
- !envoy_type_matcher_v3_StringMatcher_ignore_case(matcher);
327
306
  } else {
328
307
  errors->AddError("invalid header matcher");
329
308
  continue;
330
309
  }
331
- bool invert_match =
332
- envoy_config_route_v3_HeaderMatcher_invert_match(header);
333
310
  absl::StatusOr<HeaderMatcher> header_matcher =
334
311
  HeaderMatcher::Create(name, type, match_string, range_start, range_end,
335
312
  present_match, invert_match, case_sensitive);
@@ -746,7 +723,7 @@ std::optional<XdsRouteConfigResource::Route> ParseRoute(
746
723
  auto path_matcher = RoutePathMatchParse(match, errors);
747
724
  if (!path_matcher.has_value()) return std::nullopt;
748
725
  route.matchers.path_matcher = std::move(*path_matcher);
749
- RouteHeaderMatchersParse(match, &route, errors);
726
+ RouteHeaderMatchersParse(context, match, &route, errors);
750
727
  RouteRuntimeFractionParse(match, &route, errors);
751
728
  }
752
729
  // Parse route action.
@@ -27,6 +27,7 @@
27
27
  #include "absl/strings/string_view.h"
28
28
  #include "src/core/config/core_configuration.h"
29
29
  #include "src/core/util/down_cast.h"
30
+ #include "src/core/util/env.h"
30
31
  #include "src/core/util/json/json_reader.h"
31
32
  #include "src/core/util/json/json_writer.h"
32
33
 
@@ -82,29 +83,40 @@ const JsonLoaderInterface* GrpcXdsServer::JsonLoader(const JsonArgs&) {
82
83
 
83
84
  namespace {
84
85
 
85
- struct ChannelCreds {
86
+ struct ChannelOrCallCreds {
86
87
  std::string type;
87
88
  Json::Object config;
88
89
 
89
90
  static const JsonLoaderInterface* JsonLoader(const JsonArgs&) {
90
91
  static const auto* loader =
91
- JsonObjectLoader<ChannelCreds>()
92
- .Field("type", &ChannelCreds::type)
93
- .OptionalField("config", &ChannelCreds::config)
92
+ JsonObjectLoader<ChannelOrCallCreds>()
93
+ .Field("type", &ChannelOrCallCreds::type)
94
+ .OptionalField("config", &ChannelOrCallCreds::config)
94
95
  .Finish();
95
96
  return loader;
96
97
  }
97
98
  };
98
99
 
100
+ // TODO(roth): Remove this guard once we have reports from OSS Istio
101
+ // users that this works properly.
102
+ bool XdsBootstrapCallCredsEnabled() {
103
+ auto value = GetEnv("GRPC_EXPERIMENTAL_XDS_BOOTSTRAP_CALL_CREDS");
104
+ if (!value.has_value()) return false;
105
+ bool parsed_value;
106
+ bool parse_succeeded = gpr_parse_bool_value(value->c_str(), &parsed_value);
107
+ return parse_succeeded && parsed_value;
108
+ }
109
+
99
110
  } // namespace
100
111
 
101
112
  void GrpcXdsServer::JsonPostLoad(const Json& json, const JsonArgs& args,
102
113
  ValidationErrors* errors) {
114
+ // Parse "channel_creds".
103
115
  RefCountedPtr<ChannelCredsConfig> channel_creds_config;
104
116
  {
105
- // Parse "channel_creds".
106
- auto channel_creds_list = LoadJsonObjectField<std::vector<ChannelCreds>>(
107
- json.object(), args, "channel_creds", errors);
117
+ auto channel_creds_list =
118
+ LoadJsonObjectField<std::vector<ChannelOrCallCreds>>(
119
+ json.object(), args, "channel_creds", errors);
108
120
  if (channel_creds_list.has_value()) {
109
121
  ValidationErrors::ScopedField field(errors, ".channel_creds");
110
122
  for (size_t i = 0; i < channel_creds_list->size(); ++i) {
@@ -128,6 +140,26 @@ void GrpcXdsServer::JsonPostLoad(const Json& json, const JsonArgs& args,
128
140
  }
129
141
  }
130
142
  }
143
+ // Parse "call_creds".
144
+ std::vector<RefCountedPtr<CallCredsConfig>> call_creds_configs;
145
+ if (XdsBootstrapCallCredsEnabled()) {
146
+ auto call_creds_list = LoadJsonObjectField<std::vector<ChannelOrCallCreds>>(
147
+ json.object(), args, "call_creds", errors);
148
+ if (call_creds_list.has_value()) {
149
+ ValidationErrors::ScopedField field(errors, ".call_creds");
150
+ for (size_t i = 0; i < call_creds_list->size(); ++i) {
151
+ ValidationErrors::ScopedField field(errors, absl::StrCat("[", i, "]"));
152
+ auto& creds = (*call_creds_list)[i];
153
+ if (CoreConfiguration::Get().call_creds_registry().IsSupported(
154
+ creds.type)) {
155
+ ValidationErrors::ScopedField field(errors, ".config");
156
+ call_creds_configs.push_back(
157
+ CoreConfiguration::Get().call_creds_registry().ParseConfig(
158
+ creds.type, Json::FromObject(creds.config), args, errors));
159
+ }
160
+ }
161
+ }
162
+ }
131
163
  // Parse "server_features".
132
164
  {
133
165
  ValidationErrors::ScopedField field(errors, ".server_features");
@@ -155,7 +187,8 @@ void GrpcXdsServer::JsonPostLoad(const Json& json, const JsonArgs& args,
155
187
  json.object(), args, "server_uri", errors)
156
188
  .value_or("");
157
189
  server_target_ = std::make_shared<GrpcXdsServerTarget>(
158
- std::move(server_uri_target), std::move(channel_creds_config));
190
+ std::move(server_uri_target), std::move(channel_creds_config),
191
+ std::move(call_creds_configs));
159
192
  }
160
193
 
161
194
  std::string GrpcXdsServer::Key() const {
@@ -175,9 +208,14 @@ std::string GrpcXdsServerTarget::Key() const {
175
208
  parts.push_back("{");
176
209
  parts.push_back(absl::StrCat("server_uri=", server_uri_));
177
210
  if (channel_creds_config_ != nullptr) {
178
- parts.push_back(absl::StrCat("creds_type=", channel_creds_config_->type()));
179
211
  parts.push_back(
180
- absl::StrCat("creds_config=", channel_creds_config_->ToString()));
212
+ absl::StrCat("channel_creds={type=", channel_creds_config_->type(),
213
+ ", config=", channel_creds_config_->ToString(), "}"));
214
+ }
215
+ for (const auto& call_creds_config : call_creds_configs_) {
216
+ parts.push_back(absl::StrCat("call_creds={type=", call_creds_config->type(),
217
+ ", config=", call_creds_config->ToString(),
218
+ "}"));
181
219
  }
182
220
  parts.push_back("}");
183
221
  return absl::StrJoin(parts, ",");
@@ -185,9 +223,21 @@ std::string GrpcXdsServerTarget::Key() const {
185
223
 
186
224
  bool GrpcXdsServerTarget::Equals(const XdsServerTarget& other) const {
187
225
  const auto& o = DownCast<const GrpcXdsServerTarget&>(other);
188
- return (server_uri_ == o.server_uri_ &&
189
- channel_creds_config_->type() == o.channel_creds_config_->type() &&
190
- channel_creds_config_->Equals(*o.channel_creds_config_));
226
+ if (server_uri_ != o.server_uri_) return false;
227
+ if (channel_creds_config_->type() != o.channel_creds_config_->type() ||
228
+ !channel_creds_config_->Equals(*o.channel_creds_config_)) {
229
+ return false;
230
+ }
231
+ if (call_creds_configs_.size() != o.call_creds_configs_.size()) {
232
+ return false;
233
+ }
234
+ for (size_t i = 0; i < call_creds_configs_.size(); ++i) {
235
+ if (call_creds_configs_[i]->type() != o.call_creds_configs_[i]->type() ||
236
+ !call_creds_configs_[i]->Equals(*o.call_creds_configs_[i])) {
237
+ return false;
238
+ }
239
+ }
240
+ return true;
191
241
  }
192
242
 
193
243
  } // namespace grpc_core