grpc 1.75.0.pre1 → 1.76.0.pre1

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 (387) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +18 -5
  3. data/include/grpc/credentials.h +21 -5
  4. data/src/core/call/call_filters.cc +4 -4
  5. data/src/core/call/call_filters.h +36 -36
  6. data/src/core/call/call_spine.h +27 -27
  7. data/src/core/call/client_call.cc +6 -5
  8. data/src/core/call/filter_fusion.h +5 -5
  9. data/src/core/call/metadata_batch.h +3 -3
  10. data/src/core/call/security_context.cc +1 -1
  11. data/src/core/call/server_call.cc +4 -4
  12. data/src/core/call/server_call.h +1 -1
  13. data/src/core/channelz/channelz.cc +12 -18
  14. data/src/core/channelz/channelz.h +32 -16
  15. data/src/core/channelz/channelz_registry.h +11 -0
  16. data/src/core/channelz/property_list.cc +18 -0
  17. data/src/core/channelz/property_list.h +10 -1
  18. data/src/core/channelz/text_encode.cc +66 -0
  19. data/src/core/channelz/text_encode.h +29 -0
  20. data/src/core/channelz/v2tov1/convert.cc +11 -0
  21. data/src/core/channelz/v2tov1/legacy_api.cc +15 -8
  22. data/src/core/channelz/ztrace_collector.h +247 -86
  23. data/src/core/client_channel/backup_poller.cc +5 -6
  24. data/src/core/client_channel/client_channel.cc +20 -13
  25. data/src/core/client_channel/client_channel_filter.cc +53 -45
  26. data/src/core/client_channel/client_channel_filter.h +2 -2
  27. data/src/core/client_channel/client_channel_internal.h +3 -4
  28. data/src/core/client_channel/config_selector.h +3 -3
  29. data/src/core/client_channel/dynamic_filters.cc +3 -3
  30. data/src/core/client_channel/global_subchannel_pool.cc +0 -37
  31. data/src/core/client_channel/global_subchannel_pool.h +0 -27
  32. data/src/core/client_channel/load_balanced_call_destination.cc +7 -7
  33. data/src/core/client_channel/local_subchannel_pool.cc +4 -4
  34. data/src/core/client_channel/retry_filter.h +3 -3
  35. data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -5
  36. data/src/core/client_channel/subchannel.cc +8 -8
  37. data/src/core/client_channel/subchannel_stream_client.cc +4 -4
  38. data/src/core/config/config_vars.cc +30 -1
  39. data/src/core/config/config_vars.h +21 -0
  40. data/src/core/config/core_configuration.cc +5 -5
  41. data/src/core/config/core_configuration.h +7 -7
  42. data/src/core/config/load_config.cc +12 -0
  43. data/src/core/config/load_config.h +2 -0
  44. data/src/core/credentials/call/call_credentials.h +2 -2
  45. data/src/core/credentials/call/call_creds_util.cc +4 -3
  46. data/src/core/credentials/call/composite/composite_call_credentials.cc +4 -4
  47. data/src/core/credentials/call/external/aws_external_account_credentials.cc +3 -3
  48. data/src/core/credentials/call/external/external_account_credentials.cc +1 -1
  49. data/src/core/credentials/call/external/url_external_account_credentials.cc +1 -1
  50. data/src/core/credentials/call/iam/iam_credentials.cc +4 -4
  51. data/src/core/credentials/call/jwt/json_token.cc +3 -3
  52. data/src/core/credentials/call/jwt/jwt_credentials.cc +2 -2
  53. data/src/core/credentials/call/jwt/jwt_verifier.cc +14 -13
  54. data/src/core/credentials/call/oauth2/oauth2_credentials.cc +20 -12
  55. data/src/core/credentials/call/plugin/plugin_credentials.cc +2 -2
  56. data/src/core/credentials/transport/alts/alts_credentials.cc +4 -4
  57. data/src/core/credentials/transport/alts/alts_security_connector.cc +14 -12
  58. data/src/core/credentials/transport/alts/grpc_alts_credentials_client_options.cc +22 -2
  59. data/src/core/credentials/transport/alts/grpc_alts_credentials_options.cc +10 -1
  60. data/src/core/credentials/transport/alts/grpc_alts_credentials_options.h +31 -0
  61. data/src/core/credentials/transport/alts/grpc_alts_credentials_server_options.cc +8 -3
  62. data/src/core/credentials/transport/composite/composite_channel_credentials.cc +5 -5
  63. data/src/core/credentials/transport/fake/fake_security_connector.cc +2 -2
  64. data/src/core/credentials/transport/google_default/google_default_credentials.cc +78 -28
  65. data/src/core/credentials/transport/insecure/insecure_security_connector.cc +3 -3
  66. data/src/core/credentials/transport/local/local_security_connector.cc +8 -8
  67. data/src/core/credentials/transport/security_connector.cc +5 -5
  68. data/src/core/credentials/transport/ssl/ssl_credentials.cc +12 -12
  69. data/src/core/credentials/transport/ssl/ssl_credentials.h +2 -2
  70. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +3 -3
  71. data/src/core/credentials/transport/tls/certificate_provider_registry.cc +2 -2
  72. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +24 -24
  73. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +5 -5
  74. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +2 -2
  75. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.cc +2 -2
  76. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.h +2 -2
  77. data/src/core/credentials/transport/tls/grpc_tls_credentials_options.cc +17 -17
  78. data/src/core/credentials/transport/tls/ssl_utils.cc +14 -9
  79. data/src/core/credentials/transport/tls/tls_credentials.cc +2 -2
  80. data/src/core/credentials/transport/tls/tls_security_connector.cc +11 -11
  81. data/src/core/credentials/transport/transport_credentials.cc +2 -2
  82. data/src/core/credentials/transport/transport_credentials.h +2 -2
  83. data/src/core/credentials/transport/xds/xds_credentials.cc +5 -5
  84. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +2 -0
  85. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +1 -1
  86. data/src/core/ext/filters/http/message_compress/compression_filter.cc +8 -8
  87. data/src/core/ext/filters/http/message_compress/compression_filter.h +3 -3
  88. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +7 -7
  89. data/src/core/ext/transport/chttp2/alpn/alpn.cc +2 -2
  90. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +10 -9
  91. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +10 -7
  92. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +5 -5
  93. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +6 -6
  94. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +96 -88
  95. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  96. data/src/core/ext/transport/chttp2/transport/flow_control.h +12 -7
  97. data/src/core/ext/transport/chttp2/transport/flow_control_manager.h +60 -0
  98. data/src/core/ext/transport/chttp2/transport/frame.cc +32 -10
  99. data/src/core/ext/transport/chttp2/transport/frame.h +16 -2
  100. data/src/core/ext/transport/chttp2/transport/frame_data.cc +2 -2
  101. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +4 -4
  102. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -2
  103. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -2
  104. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +3 -3
  105. data/src/core/ext/transport/chttp2/transport/header_assembler.h +28 -12
  106. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +2 -2
  107. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -2
  108. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +8 -8
  109. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.cc +2 -2
  110. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.h +2 -2
  111. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -27
  112. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -3
  113. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +4 -4
  114. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +543 -366
  115. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +198 -277
  116. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +3 -0
  117. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +11 -0
  118. data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +179 -0
  119. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +51 -23
  120. data/src/core/ext/transport/chttp2/transport/http2_transport.h +13 -6
  121. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +115 -71
  122. data/src/core/ext/transport/chttp2/transport/internal.h +6 -14
  123. data/src/core/ext/transport/chttp2/transport/message_assembler.h +7 -7
  124. data/src/core/ext/transport/chttp2/transport/parsing.cc +17 -15
  125. data/src/core/ext/transport/chttp2/transport/ping_callbacks.cc +2 -2
  126. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +62 -26
  127. data/src/core/ext/transport/chttp2/transport/ping_promise.h +58 -22
  128. data/src/core/ext/transport/chttp2/transport/stream.h +207 -0
  129. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +328 -187
  130. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +7 -7
  131. data/src/core/ext/transport/chttp2/transport/transport_common.cc +17 -1
  132. data/src/core/ext/transport/chttp2/transport/transport_common.h +52 -0
  133. data/src/core/ext/transport/chttp2/transport/varint.h +2 -2
  134. data/src/core/ext/transport/chttp2/transport/writable_streams.h +181 -79
  135. data/src/core/ext/transport/chttp2/transport/write_size_policy.cc +2 -2
  136. data/src/core/ext/transport/chttp2/transport/writing.cc +3 -3
  137. data/src/core/ext/transport/inproc/inproc_transport.cc +1 -1
  138. data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +3 -3
  139. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb.h +740 -0
  140. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb_minitable.c +218 -0
  141. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb_minitable.h +46 -0
  142. data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb.h +87 -55
  143. data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb_minitable.c +23 -21
  144. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/channelz.upbdefs.c +80 -0
  145. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/channelz.upbdefs.h +47 -0
  146. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/service.upbdefs.c +129 -0
  147. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/service.upbdefs.h +72 -0
  148. data/src/core/filter/auth/server_auth_filter.cc +2 -2
  149. data/src/core/handshaker/handshaker.cc +3 -3
  150. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +2 -2
  151. data/src/core/handshaker/security/legacy_secure_endpoint.cc +2 -2
  152. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +31 -8
  153. data/src/core/handshaker/security/secure_endpoint.cc +16 -6
  154. data/src/core/handshaker/security/security_handshaker.cc +3 -3
  155. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +2 -2
  156. data/src/core/lib/channel/channel_stack.cc +8 -5
  157. data/src/core/lib/channel/channel_stack.h +3 -0
  158. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -0
  159. data/src/core/lib/channel/connected_channel.cc +2 -2
  160. data/src/core/lib/channel/promise_based_filter.cc +69 -64
  161. data/src/core/lib/channel/promise_based_filter.h +16 -15
  162. data/src/core/lib/compression/compression_internal.cc +2 -2
  163. data/src/core/lib/compression/message_compress.cc +7 -7
  164. data/src/core/lib/event_engine/ares_resolver.cc +22 -20
  165. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +2 -2
  166. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +2 -2
  167. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.h +2 -2
  168. data/src/core/lib/event_engine/extensions/channelz.h +2 -2
  169. data/src/core/lib/event_engine/extensions/supports_fd.h +5 -5
  170. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +8 -8
  171. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +10 -10
  172. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +2 -2
  173. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +23 -22
  174. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +11 -11
  175. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +168 -170
  176. data/src/core/lib/event_engine/posix_engine/posix_engine.h +33 -54
  177. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +4 -3
  178. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +5 -5
  179. data/src/core/lib/event_engine/posix_engine/posix_interface.h +1 -1
  180. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1 -1
  181. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +3 -3
  182. data/src/core/lib/event_engine/resolved_address.cc +3 -3
  183. data/src/core/lib/event_engine/shim.cc +8 -11
  184. data/src/core/lib/event_engine/shim.h +2 -1
  185. data/src/core/lib/event_engine/slice.cc +2 -2
  186. data/src/core/lib/event_engine/tcp_socket_utils.cc +11 -11
  187. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +7 -7
  188. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +31 -31
  189. data/src/core/lib/event_engine/windows/iocp.cc +10 -10
  190. data/src/core/lib/event_engine/windows/win_socket.cc +6 -6
  191. data/src/core/lib/event_engine/windows/windows_endpoint.cc +11 -11
  192. data/src/core/lib/event_engine/windows/windows_engine.cc +16 -14
  193. data/src/core/lib/event_engine/windows/windows_listener.cc +7 -7
  194. data/src/core/lib/experiments/experiments.cc +105 -18
  195. data/src/core/lib/experiments/experiments.h +43 -11
  196. data/src/core/lib/iomgr/call_combiner.cc +3 -3
  197. data/src/core/lib/iomgr/endpoint_cfstream.cc +6 -6
  198. data/src/core/lib/iomgr/endpoint_pair_posix.cc +5 -5
  199. data/src/core/lib/iomgr/endpoint_pair_windows.cc +15 -14
  200. data/src/core/lib/iomgr/ev_epoll1_linux.cc +15 -15
  201. data/src/core/lib/iomgr/ev_poll_posix.cc +11 -11
  202. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +5 -4
  203. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +1 -1
  204. data/src/core/lib/iomgr/iocp_windows.cc +8 -8
  205. data/src/core/lib/iomgr/iomgr_windows.cc +3 -3
  206. data/src/core/lib/iomgr/lockfree_event.cc +2 -2
  207. data/src/core/lib/iomgr/polling_entity.cc +3 -3
  208. data/src/core/lib/iomgr/socket_utils_common_posix.cc +2 -2
  209. data/src/core/lib/iomgr/socket_windows.cc +4 -4
  210. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -4
  211. data/src/core/lib/iomgr/tcp_client_windows.cc +4 -4
  212. data/src/core/lib/iomgr/tcp_posix.cc +42 -42
  213. data/src/core/lib/iomgr/tcp_server.cc +5 -0
  214. data/src/core/lib/iomgr/tcp_server.h +7 -0
  215. data/src/core/lib/iomgr/tcp_server_posix.cc +47 -27
  216. data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -0
  217. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +5 -5
  218. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +2 -2
  219. data/src/core/lib/iomgr/tcp_server_windows.cc +68 -29
  220. data/src/core/lib/iomgr/tcp_windows.cc +7 -7
  221. data/src/core/lib/iomgr/timer_generic.cc +2 -2
  222. data/src/core/lib/iomgr/timer_manager.cc +2 -2
  223. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -2
  224. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +2 -2
  225. data/src/core/lib/promise/activity.cc +2 -2
  226. data/src/core/lib/promise/activity.h +6 -6
  227. data/src/core/lib/promise/context.h +2 -2
  228. data/src/core/lib/promise/detail/join_state.h +9 -9
  229. data/src/core/lib/promise/detail/seq_state.h +13 -13
  230. data/src/core/lib/promise/detail/status.h +2 -2
  231. data/src/core/lib/promise/for_each.h +5 -5
  232. data/src/core/lib/promise/interceptor_list.h +2 -2
  233. data/src/core/lib/promise/latch.h +7 -7
  234. data/src/core/lib/promise/mpsc.cc +26 -26
  235. data/src/core/lib/promise/mpsc.h +2 -2
  236. data/src/core/lib/promise/observable.h +4 -4
  237. data/src/core/lib/promise/party.cc +32 -25
  238. data/src/core/lib/promise/party.h +16 -19
  239. data/src/core/lib/promise/pipe.h +15 -15
  240. data/src/core/lib/promise/poll.h +5 -4
  241. data/src/core/lib/promise/promise.h +0 -2
  242. data/src/core/lib/promise/sleep.cc +3 -1
  243. data/src/core/lib/promise/status_flag.h +7 -7
  244. data/src/core/lib/promise/try_join.h +2 -2
  245. data/src/core/lib/promise/try_seq.h +2 -2
  246. data/src/core/lib/resource_quota/arena.h +15 -2
  247. data/src/core/lib/resource_quota/connection_quota.cc +9 -7
  248. data/src/core/lib/resource_quota/memory_quota.cc +45 -24
  249. data/src/core/lib/resource_quota/memory_quota.h +48 -16
  250. data/src/core/lib/resource_quota/telemetry.h +54 -0
  251. data/src/core/lib/resource_quota/thread_quota.cc +2 -2
  252. data/src/core/lib/resource_tracker/resource_tracker.cc +33 -0
  253. data/src/core/lib/resource_tracker/resource_tracker.h +46 -0
  254. data/src/core/lib/security/authorization/audit_logging.cc +5 -5
  255. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +2 -2
  256. data/src/core/lib/security/authorization/stdout_logger.cc +3 -3
  257. data/src/core/lib/surface/byte_buffer_reader.cc +2 -2
  258. data/src/core/lib/surface/call.cc +16 -14
  259. data/src/core/lib/surface/call.h +1 -1
  260. data/src/core/lib/surface/call_utils.cc +2 -2
  261. data/src/core/lib/surface/call_utils.h +2 -2
  262. data/src/core/lib/surface/channel.cc +4 -4
  263. data/src/core/lib/surface/channel_create.cc +10 -6
  264. data/src/core/lib/surface/channel_init.cc +80 -23
  265. data/src/core/lib/surface/channel_init.h +26 -11
  266. data/src/core/lib/surface/completion_queue.cc +17 -16
  267. data/src/core/lib/surface/completion_queue_factory.cc +7 -7
  268. data/src/core/lib/surface/connection_context.h +45 -2
  269. data/src/core/lib/surface/filter_stack_call.cc +12 -23
  270. data/src/core/lib/surface/filter_stack_call.h +3 -4
  271. data/src/core/lib/surface/legacy_channel.cc +7 -7
  272. data/src/core/lib/surface/validate_metadata.h +2 -2
  273. data/src/core/lib/surface/version.cc +2 -2
  274. data/src/core/lib/transport/bdp_estimator.cc +2 -2
  275. data/src/core/lib/transport/bdp_estimator.h +3 -3
  276. data/src/core/lib/transport/promise_endpoint.cc +3 -3
  277. data/src/core/lib/transport/promise_endpoint.h +8 -8
  278. data/src/core/lib/transport/timeout_encoding.cc +4 -4
  279. data/src/core/load_balancing/child_policy_handler.cc +4 -4
  280. data/src/core/load_balancing/endpoint_list.cc +2 -2
  281. data/src/core/load_balancing/grpclb/grpclb.cc +24 -24
  282. data/src/core/load_balancing/health_check_client.cc +4 -4
  283. data/src/core/load_balancing/health_check_client_internal.h +2 -2
  284. data/src/core/load_balancing/lb_policy_registry.cc +2 -2
  285. data/src/core/load_balancing/oob_backend_metric.cc +4 -4
  286. data/src/core/load_balancing/oob_backend_metric_internal.h +2 -2
  287. data/src/core/load_balancing/outlier_detection/outlier_detection.cc +2 -2
  288. data/src/core/load_balancing/pick_first/pick_first.cc +14 -14
  289. data/src/core/load_balancing/priority/priority.cc +23 -24
  290. data/src/core/load_balancing/ring_hash/ring_hash.cc +3 -3
  291. data/src/core/load_balancing/rls/rls.cc +13 -13
  292. data/src/core/load_balancing/round_robin/round_robin.cc +9 -9
  293. data/src/core/load_balancing/weighted_round_robin/static_stride_scheduler.cc +3 -3
  294. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +33 -26
  295. data/src/core/load_balancing/weighted_target/weighted_target.cc +5 -5
  296. data/src/core/load_balancing/xds/cds.cc +76 -32
  297. data/src/core/load_balancing/xds/xds_cluster_impl.cc +3 -3
  298. data/src/core/load_balancing/xds/xds_override_host.cc +4 -4
  299. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  300. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +33 -33
  301. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +10 -10
  302. data/src/core/resolver/dns/dns_resolver_plugin.cc +6 -3
  303. data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +2 -2
  304. data/src/core/resolver/endpoint_addresses.cc +3 -3
  305. data/src/core/resolver/endpoint_addresses.h +3 -0
  306. data/src/core/resolver/fake/fake_resolver.cc +2 -2
  307. data/src/core/resolver/google_c2p/google_c2p_resolver.cc +41 -54
  308. data/src/core/resolver/polling_resolver.cc +3 -3
  309. data/src/core/resolver/resolver_registry.cc +5 -4
  310. data/src/core/resolver/xds/xds_dependency_manager.cc +5 -5
  311. data/src/core/resolver/xds/xds_resolver.cc +9 -9
  312. data/src/core/server/server.cc +38 -38
  313. data/src/core/server/server_call_tracer_filter.h +4 -4
  314. data/src/core/server/server_config_selector_filter.cc +2 -2
  315. data/src/core/server/xds_server_config_fetcher.cc +9 -8
  316. data/src/core/service_config/service_config_impl.h +2 -2
  317. data/src/core/telemetry/call_tracer.cc +39 -49
  318. data/src/core/telemetry/call_tracer.h +199 -22
  319. data/src/core/telemetry/histogram.h +205 -0
  320. data/src/core/telemetry/instrument.cc +719 -0
  321. data/src/core/telemetry/instrument.h +932 -0
  322. data/src/core/telemetry/metrics.cc +13 -5
  323. data/src/core/telemetry/metrics.h +3 -1
  324. data/src/core/telemetry/stats_data.cc +0 -19
  325. data/src/core/telemetry/stats_data.h +0 -19
  326. data/src/core/transport/auth_context.cc +2 -2
  327. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +78 -45
  328. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -0
  329. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +3 -3
  330. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +39 -31
  331. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +3 -3
  332. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +3 -3
  333. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +7 -7
  334. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +3 -3
  335. data/src/core/tsi/fake_transport_security.cc +4 -4
  336. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +4 -4
  337. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +9 -9
  338. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +3 -3
  339. data/src/core/tsi/ssl_transport_security.cc +26 -25
  340. data/src/core/tsi/ssl_transport_security_utils.cc +9 -9
  341. data/src/core/util/chunked_vector.h +4 -4
  342. data/src/core/util/event_log.cc +2 -2
  343. data/src/core/util/gcp_metadata_query.cc +2 -2
  344. data/src/core/util/grpc_check.cc +22 -0
  345. data/src/core/util/grpc_check.h +103 -0
  346. data/src/core/util/http_client/httpcli.cc +3 -3
  347. data/src/core/util/http_client/parser.cc +4 -4
  348. data/src/core/util/latent_see.h +7 -4
  349. data/src/core/util/lru_cache.h +4 -4
  350. data/src/core/util/memory_usage.h +16 -0
  351. data/src/core/util/posix/directory_reader.cc +3 -2
  352. data/src/core/util/posix/sync.cc +24 -24
  353. data/src/core/util/postmortem_emit.cc +52 -0
  354. data/src/core/util/postmortem_emit.h +30 -0
  355. data/src/core/util/ref_counted_ptr.h +5 -0
  356. data/src/core/util/trie_lookup.h +170 -0
  357. data/src/core/util/unique_ptr_with_bitset.h +5 -5
  358. data/src/core/xds/grpc/xds_bootstrap_grpc.h +6 -1
  359. data/src/core/xds/grpc/xds_certificate_provider.cc +3 -3
  360. data/src/core/xds/grpc/xds_client_grpc.cc +34 -15
  361. data/src/core/xds/grpc/xds_client_grpc.h +4 -1
  362. data/src/core/xds/grpc/xds_cluster_parser.cc +2 -2
  363. data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +2 -2
  364. data/src/core/xds/grpc/xds_endpoint_parser.cc +2 -2
  365. data/src/core/xds/grpc/xds_http_filter_registry.cc +4 -3
  366. data/src/core/xds/grpc/xds_listener_parser.cc +3 -3
  367. data/src/core/xds/grpc/xds_matcher.cc +277 -0
  368. data/src/core/xds/grpc/xds_matcher.h +432 -0
  369. data/src/core/xds/grpc/xds_matcher_action.cc +47 -0
  370. data/src/core/xds/grpc/xds_matcher_action.h +48 -0
  371. data/src/core/xds/grpc/xds_matcher_context.cc +29 -0
  372. data/src/core/xds/grpc/xds_matcher_context.h +46 -0
  373. data/src/core/xds/grpc/xds_matcher_input.cc +79 -0
  374. data/src/core/xds/grpc/xds_matcher_input.h +105 -0
  375. data/src/core/xds/grpc/xds_matcher_parse.cc +356 -0
  376. data/src/core/xds/grpc/xds_matcher_parse.h +39 -0
  377. data/src/core/xds/grpc/xds_metadata.cc +4 -3
  378. data/src/core/xds/grpc/xds_route_config_parser.cc +6 -6
  379. data/src/core/xds/grpc/xds_routing.cc +3 -3
  380. data/src/core/xds/grpc/xds_transport_grpc.cc +10 -10
  381. data/src/core/xds/xds_client/lrs_client.cc +6 -6
  382. data/src/core/xds/xds_client/xds_client.cc +9 -9
  383. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +2 -2
  384. data/src/ruby/lib/grpc/version.rb +1 -1
  385. data/third_party/abseil-cpp/absl/container/internal/node_slot_policy.h +95 -0
  386. data/third_party/abseil-cpp/absl/container/node_hash_map.h +687 -0
  387. metadata +37 -2
@@ -28,6 +28,8 @@
28
28
  #include "absl/status/statusor.h"
29
29
  #include "absl/strings/string_view.h"
30
30
  #include "absl/time/time.h"
31
+ #include "src/core/lib/slice/slice.h"
32
+ #include "src/core/lib/slice/slice_buffer.h"
31
33
  #include "src/core/util/time.h"
32
34
 
33
35
  namespace grpc_core {
@@ -88,6 +90,10 @@ template <typename T>
88
90
  constexpr Category kMemoryUsageCategory<std::shared_ptr<T>> =
89
91
  Category::kOwnedPointer;
90
92
 
93
+ template <typename T>
94
+ constexpr Category kMemoryUsageCategory<absl::StatusOr<T>> =
95
+ Category::kAbslStatusOr;
96
+
91
97
  template <typename T>
92
98
  constexpr Category kMemoryUsageCategory<std::vector<T>> = Category::kVector;
93
99
 
@@ -135,6 +141,10 @@ size_t MemoryUsageOf(const T& x) {
135
141
  return sizeof(T);
136
142
  } else if constexpr (std::is_same_v<T, Duration>) {
137
143
  return sizeof(T);
144
+ } else if constexpr (std::is_same_v<T, Slice>) {
145
+ return sizeof(T) + x.size(); // may overestimate a bit
146
+ } else if constexpr (std::is_same_v<T, SliceBuffer>) {
147
+ return sizeof(T) + x.Length(); // may overestimate a bit
138
148
  } else if constexpr (category == Category::kSimple) {
139
149
  return sizeof(T);
140
150
  } else if constexpr (category == Category::kOwnedPointer) {
@@ -263,6 +273,12 @@ size_t MemoryUsageOf(const std::tuple<Args...>& t) {
263
273
  [](const auto&... args) { return (MemoryUsageOf(args) + ... + 0); }, t);
264
274
  }
265
275
 
276
+ // This does not calculate the overhead of the variant itself.
277
+ template <typename... T>
278
+ size_t MemoryUsageOf(const std::variant<T...>& t) {
279
+ return std::visit([](const auto& x) { return MemoryUsageOf(x); }, t);
280
+ }
281
+
266
282
  } // namespace grpc_core
267
283
 
268
284
  #endif // GRPC_SRC_CORE_UTIL_MEMORY_USAGE_H
@@ -25,7 +25,7 @@
25
25
  #include "absl/strings/string_view.h"
26
26
 
27
27
  #if defined(GPR_LINUX) || defined(GPR_ANDROID) || defined(GPR_FREEBSD) || \
28
- defined(GPR_APPLE) || defined(GPR_NETBSD)
28
+ defined(GPR_APPLE) || defined(GPR_NETBSD) || defined(GPR_OPENBSD)
29
29
 
30
30
  #include <dirent.h>
31
31
 
@@ -79,4 +79,5 @@ absl::Status DirectoryReaderImpl::ForEach(
79
79
  }
80
80
  } // namespace grpc_core
81
81
 
82
- #endif // GPR_LINUX || GPR_ANDROID || GPR_FREEBSD || GPR_APPLE
82
+ #endif // GPR_LINUX || GPR_ANDROID || GPR_FREEBSD || GPR_APPLE ||
83
+ // GPR_NETBSD || GPR_OPENBSD
@@ -27,40 +27,40 @@
27
27
  #include <grpc/support/time.h>
28
28
  #include <time.h>
29
29
 
30
- #include "absl/log/check.h"
30
+ #include "src/core/util/grpc_check.h"
31
31
 
32
32
  void gpr_mu_init(gpr_mu* mu) {
33
33
  #ifdef GRPC_ASAN_ENABLED
34
- CHECK_EQ(pthread_mutex_init(&mu->mutex, nullptr), 0);
34
+ GRPC_CHECK_EQ(pthread_mutex_init(&mu->mutex, nullptr), 0);
35
35
  mu->leak_checker = static_cast<int*>(malloc(sizeof(*mu->leak_checker)));
36
- CHECK_NE(mu->leak_checker, nullptr);
36
+ GRPC_CHECK_NE(mu->leak_checker, nullptr);
37
37
  #else
38
- CHECK_EQ(pthread_mutex_init(mu, nullptr), 0);
38
+ GRPC_CHECK_EQ(pthread_mutex_init(mu, nullptr), 0);
39
39
  #endif
40
40
  }
41
41
 
42
42
  void gpr_mu_destroy(gpr_mu* mu) {
43
43
  #ifdef GRPC_ASAN_ENABLED
44
- CHECK_EQ(pthread_mutex_destroy(&mu->mutex), 0);
44
+ GRPC_CHECK_EQ(pthread_mutex_destroy(&mu->mutex), 0);
45
45
  free(mu->leak_checker);
46
46
  #else
47
- CHECK_EQ(pthread_mutex_destroy(mu), 0);
47
+ GRPC_CHECK_EQ(pthread_mutex_destroy(mu), 0);
48
48
  #endif
49
49
  }
50
50
 
51
51
  void gpr_mu_lock(gpr_mu* mu) {
52
52
  #ifdef GRPC_ASAN_ENABLED
53
- CHECK_EQ(pthread_mutex_lock(&mu->mutex), 0);
53
+ GRPC_CHECK_EQ(pthread_mutex_lock(&mu->mutex), 0);
54
54
  #else
55
- CHECK_EQ(pthread_mutex_lock(mu), 0);
55
+ GRPC_CHECK_EQ(pthread_mutex_lock(mu), 0);
56
56
  #endif
57
57
  }
58
58
 
59
59
  void gpr_mu_unlock(gpr_mu* mu) {
60
60
  #ifdef GRPC_ASAN_ENABLED
61
- CHECK_EQ(pthread_mutex_unlock(&mu->mutex), 0);
61
+ GRPC_CHECK_EQ(pthread_mutex_unlock(&mu->mutex), 0);
62
62
  #else
63
- CHECK_EQ(pthread_mutex_unlock(mu), 0);
63
+ GRPC_CHECK_EQ(pthread_mutex_unlock(mu), 0);
64
64
  #endif
65
65
  }
66
66
 
@@ -71,7 +71,7 @@ int gpr_mu_trylock(gpr_mu* mu) {
71
71
  #else
72
72
  err = pthread_mutex_trylock(mu);
73
73
  #endif
74
- CHECK(err == 0 || err == EBUSY);
74
+ GRPC_CHECK(err == 0 || err == EBUSY);
75
75
  return err == 0;
76
76
  }
77
77
 
@@ -79,26 +79,26 @@ int gpr_mu_trylock(gpr_mu* mu) {
79
79
 
80
80
  void gpr_cv_init(gpr_cv* cv) {
81
81
  pthread_condattr_t attr;
82
- CHECK_EQ(pthread_condattr_init(&attr), 0);
82
+ GRPC_CHECK_EQ(pthread_condattr_init(&attr), 0);
83
83
  #if GPR_LINUX
84
- CHECK_EQ(pthread_condattr_setclock(&attr, CLOCK_MONOTONIC), 0);
84
+ GRPC_CHECK_EQ(pthread_condattr_setclock(&attr, CLOCK_MONOTONIC), 0);
85
85
  #endif // GPR_LINUX
86
86
 
87
87
  #ifdef GRPC_ASAN_ENABLED
88
- CHECK_EQ(pthread_cond_init(&cv->cond_var, &attr), 0);
88
+ GRPC_CHECK_EQ(pthread_cond_init(&cv->cond_var, &attr), 0);
89
89
  cv->leak_checker = static_cast<int*>(malloc(sizeof(*cv->leak_checker)));
90
- CHECK_NE(cv->leak_checker, nullptr);
90
+ GRPC_CHECK_NE(cv->leak_checker, nullptr);
91
91
  #else
92
- CHECK_EQ(pthread_cond_init(cv, &attr), 0);
92
+ GRPC_CHECK_EQ(pthread_cond_init(cv, &attr), 0);
93
93
  #endif
94
94
  }
95
95
 
96
96
  void gpr_cv_destroy(gpr_cv* cv) {
97
97
  #ifdef GRPC_ASAN_ENABLED
98
- CHECK_EQ(pthread_cond_destroy(&cv->cond_var), 0);
98
+ GRPC_CHECK_EQ(pthread_cond_destroy(&cv->cond_var), 0);
99
99
  free(cv->leak_checker);
100
100
  #else
101
- CHECK_EQ(pthread_cond_destroy(cv), 0);
101
+ GRPC_CHECK_EQ(pthread_cond_destroy(cv), 0);
102
102
  #endif
103
103
  }
104
104
 
@@ -127,30 +127,30 @@ int gpr_cv_wait(gpr_cv* cv, gpr_mu* mu, gpr_timespec abs_deadline) {
127
127
  err = pthread_cond_timedwait(cv, mu, &abs_deadline_ts);
128
128
  #endif
129
129
  }
130
- CHECK(err == 0 || err == ETIMEDOUT || err == EAGAIN);
130
+ GRPC_CHECK(err == 0 || err == ETIMEDOUT || err == EAGAIN);
131
131
  return err == ETIMEDOUT;
132
132
  }
133
133
 
134
134
  void gpr_cv_signal(gpr_cv* cv) {
135
135
  #ifdef GRPC_ASAN_ENABLED
136
- CHECK_EQ(pthread_cond_signal(&cv->cond_var), 0);
136
+ GRPC_CHECK_EQ(pthread_cond_signal(&cv->cond_var), 0);
137
137
  #else
138
- CHECK_EQ(pthread_cond_signal(cv), 0);
138
+ GRPC_CHECK_EQ(pthread_cond_signal(cv), 0);
139
139
  #endif
140
140
  }
141
141
 
142
142
  void gpr_cv_broadcast(gpr_cv* cv) {
143
143
  #ifdef GRPC_ASAN_ENABLED
144
- CHECK_EQ(pthread_cond_broadcast(&cv->cond_var), 0);
144
+ GRPC_CHECK_EQ(pthread_cond_broadcast(&cv->cond_var), 0);
145
145
  #else
146
- CHECK_EQ(pthread_cond_broadcast(cv), 0);
146
+ GRPC_CHECK_EQ(pthread_cond_broadcast(cv), 0);
147
147
  #endif
148
148
  }
149
149
 
150
150
  //----------------------------------------
151
151
 
152
152
  void gpr_once_init(gpr_once* once, void (*init_function)(void)) {
153
- CHECK_EQ(pthread_once(once, init_function), 0);
153
+ GRPC_CHECK_EQ(pthread_once(once, init_function), 0);
154
154
  }
155
155
 
156
156
  #endif // defined(GPR_POSIX_SYNC) && !defined(GPR_ABSEIL_SYNC) &&
@@ -0,0 +1,52 @@
1
+ // Copyright 2025 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/postmortem_emit.h"
16
+
17
+ #include <iostream>
18
+ #include <sstream>
19
+
20
+ #include "src/core/channelz/channelz_registry.h"
21
+ #include "src/core/telemetry/stats.h"
22
+
23
+ namespace grpc_core {
24
+
25
+ namespace {
26
+
27
+ void RunPostMortem(std::ostream& out) {
28
+ out << "===========================================================\n";
29
+ out << "🛑 gRPC Test Postmortem Analysis 🛑\n";
30
+ out << "===========================================================\n";
31
+
32
+ out << "❗ gRPC Statistics:\n"
33
+ << StatsAsJson(global_stats().Collect().get()) << "\n";
34
+
35
+ out << "❗ channelz entities:\n";
36
+ for (const auto& node : channelz::ChannelzRegistry::GetAllEntities()) {
37
+ out << " 🔴 [" << node->uuid() << ":"
38
+ << channelz::BaseNode::EntityTypeString(node->type())
39
+ << "]: " << node->RenderJsonString() << "\n";
40
+ }
41
+ }
42
+
43
+ } // namespace
44
+
45
+ void PostMortemEmit() { RunPostMortem(std::cerr); }
46
+
47
+ void SilentPostMortemEmit() {
48
+ std::ostringstream out;
49
+ RunPostMortem(out);
50
+ }
51
+
52
+ } // namespace grpc_core
@@ -0,0 +1,30 @@
1
+ // Copyright 2025 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
+ #ifndef GRPC_SRC_CORE_UTIL_POSTMORTEM_EMIT_H
16
+ #define GRPC_SRC_CORE_UTIL_POSTMORTEM_EMIT_H
17
+
18
+ namespace grpc_core {
19
+
20
+ // Emit useful post mortem analysis from whatever in-process data we have.
21
+ void PostMortemEmit();
22
+
23
+ // Does all the work of PostMortemEmit, but doesn't emit anything.
24
+ // This is useful for verifying that PostMortemEmit *would* succeed...
25
+ // which means especially that channelz is working.
26
+ void SilentPostMortemEmit();
27
+
28
+ } // namespace grpc_core
29
+
30
+ #endif // GRPC_SRC_CORE_UTIL_POSTMORTEM_EMIT_H
@@ -464,6 +464,11 @@ struct WeakRefCountedPtrEq {
464
464
  }
465
465
  };
466
466
 
467
+ template <typename To, typename From>
468
+ RefCountedPtr<To> DownCastRefCountedPtr(RefCountedPtr<From> ptr) {
469
+ return RefCountedPtr<To>(DownCast<To*>(ptr.release()));
470
+ }
471
+
467
472
  } // namespace grpc_core
468
473
 
469
474
  #endif // GRPC_SRC_CORE_UTIL_REF_COUNTED_PTR_H
@@ -0,0 +1,170 @@
1
+ //
2
+ // Copyright 2025 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
+ //
16
+
17
+ #ifndef GRPC_SRC_CORE_UTIL_TRIE_LOOKUP_H
18
+ #define GRPC_SRC_CORE_UTIL_TRIE_LOOKUP_H
19
+
20
+ #include <cstdint>
21
+ #include <memory>
22
+ #include <utility>
23
+
24
+ #include "absl/container/flat_hash_map.h"
25
+ #include "absl/types/optional.h"
26
+
27
+ namespace grpc_core {
28
+
29
+ template <typename Value>
30
+ class TrieLookupTree {
31
+ public:
32
+ TrieLookupTree() : root_(std::make_unique<TrieNode>()) {}
33
+
34
+ // Takes value by r-value reference to consume it.
35
+ bool AddNode(absl::string_view key, Value value) {
36
+ auto* node = root_.get();
37
+ for (auto c : key) {
38
+ auto& child = node->child[c];
39
+ if (child == nullptr) {
40
+ child = std::make_unique<TrieNode>();
41
+ }
42
+ node = child.get();
43
+ }
44
+ node->value = std::move(value);
45
+ return true;
46
+ }
47
+
48
+ // Returns a const pointer to the value.
49
+ const Value* Lookup(absl::string_view key) const {
50
+ const auto* node = root_.get();
51
+ for (auto c : key) {
52
+ auto it = node->child.find(c);
53
+ if (it == node->child.end()) {
54
+ return nullptr;
55
+ }
56
+ node = it->second.get();
57
+ }
58
+ if (node->value.has_value()) {
59
+ return &*node->value;
60
+ }
61
+ return nullptr;
62
+ }
63
+
64
+ // Return longest matching prefix
65
+ const Value* LookupLongestPrefix(absl::string_view key) const {
66
+ const auto* node = root_.get();
67
+ const Value* matched_value = nullptr;
68
+ if (node->value.has_value()) {
69
+ matched_value = &*node->value;
70
+ }
71
+ for (auto c : key) {
72
+ auto it = node->child.find(c);
73
+ if (it == node->child.end()) {
74
+ return matched_value;
75
+ }
76
+ node = it->second.get();
77
+ if (node->value.has_value()) {
78
+ matched_value = &*node->value;
79
+ }
80
+ }
81
+ return matched_value;
82
+ }
83
+
84
+ // Invokes cb for least to most matching prefix
85
+ void ForEachPrefixMatch(absl::string_view key,
86
+ absl::FunctionRef<void(const Value&)> cb) const {
87
+ const auto* node = root_.get();
88
+ for (auto c : key) {
89
+ auto it = node->child.find(c);
90
+ if (it == node->child.end()) {
91
+ return;
92
+ }
93
+ node = it->second.get();
94
+ if (node->value.has_value()) {
95
+ cb(*node->value);
96
+ }
97
+ }
98
+ }
99
+
100
+ // invokes cb for every value present in trie
101
+ // Useful for ToString Method to dump Trie
102
+ // Format of cb "void(key, value)"
103
+ void ForEach(
104
+ absl::FunctionRef<void(absl::string_view, const Value&)> cb) const {
105
+ if (root_ == nullptr) return;
106
+ std::string key;
107
+ ForEachRecursive(root_.get(), key, cb);
108
+ }
109
+
110
+ // Check for equality
111
+ bool operator==(const TrieLookupTree& other) const {
112
+ if (this == &other) return true;
113
+ if (root_ == nullptr || other.root_ == nullptr) {
114
+ return root_ == other.root_;
115
+ }
116
+ std::vector<std::pair<const TrieNode*, const TrieNode*>> nodes_to_compare;
117
+ nodes_to_compare.emplace_back(root_.get(), other.root_.get());
118
+ while (!nodes_to_compare.empty()) {
119
+ auto [node1, node2] = nodes_to_compare.back();
120
+ nodes_to_compare.pop_back();
121
+ if (node1->value.has_value() != node2->value.has_value()) {
122
+ return false;
123
+ }
124
+ if (node1->value.has_value()) {
125
+ if (!(*node1->value == *node2->value)) return false;
126
+ }
127
+ if (node1->child.size() != node2->child.size()) {
128
+ return false;
129
+ }
130
+ for (const auto& [key, child1_ptr] : node1->child) {
131
+ auto it = node2->child.find(key);
132
+ if (it == node2->child.end()) {
133
+ return false;
134
+ }
135
+ nodes_to_compare.emplace_back(child1_ptr.get(), it->second.get());
136
+ }
137
+ }
138
+ return true;
139
+ }
140
+ bool operator!=(const TrieLookupTree& other) const {
141
+ return !(*this == other);
142
+ }
143
+
144
+ private:
145
+ struct TrieNode {
146
+ absl::flat_hash_map<uint8_t, std::unique_ptr<TrieNode>> child;
147
+ std::optional<Value> value;
148
+ };
149
+
150
+ void ForEachRecursive(
151
+ const TrieNode* node, std::string& current_key,
152
+ absl::FunctionRef<void(absl::string_view, const Value&)> cb) const {
153
+ // check for value and invoke cb
154
+ if (node->value.has_value()) {
155
+ cb(current_key, *node->value);
156
+ }
157
+ // Recurse on childeren
158
+ for (const auto& [character, child_node] : node->child) {
159
+ current_key.push_back(character);
160
+ ForEachRecursive(child_node.get(), current_key, cb);
161
+ current_key.pop_back();
162
+ }
163
+ }
164
+
165
+ std::unique_ptr<TrieNode> root_;
166
+ };
167
+
168
+ } // namespace grpc_core
169
+
170
+ #endif // GRPC_SRC_CORE_UTIL_TRIE_LOOKUP_H
@@ -18,8 +18,8 @@
18
18
  #include <memory>
19
19
  #include <utility>
20
20
 
21
- #include "absl/log/check.h"
22
21
  #include "absl/numeric/bits.h"
22
+ #include "src/core/util/grpc_check.h"
23
23
 
24
24
  namespace grpc_core {
25
25
 
@@ -36,7 +36,7 @@ class UniquePtrWithBitset {
36
36
  UniquePtrWithBitset(std::unique_ptr<T>&& p)
37
37
  : UniquePtrWithBitset(p.release()) {}
38
38
  ~UniquePtrWithBitset() {
39
- DCHECK_LE(kBits, static_cast<size_t>(absl::countr_zero(alignof(T))));
39
+ GRPC_DCHECK_LE(kBits, static_cast<size_t>(absl::countr_zero(alignof(T))));
40
40
  delete get();
41
41
  }
42
42
  UniquePtrWithBitset(const UniquePtrWithBitset&) = delete;
@@ -59,15 +59,15 @@ class UniquePtrWithBitset {
59
59
  }
60
60
 
61
61
  void SetBit(size_t bit) {
62
- DCHECK_LT(bit, kBits);
62
+ GRPC_DCHECK_LT(bit, kBits);
63
63
  p_ |= 1 << bit;
64
64
  }
65
65
  void ClearBit(size_t bit) {
66
- DCHECK_LT(bit, kBits);
66
+ GRPC_DCHECK_LT(bit, kBits);
67
67
  p_ &= ~(1 << bit);
68
68
  }
69
69
  bool TestBit(size_t bit) const {
70
- DCHECK_LT(bit, kBits);
70
+ GRPC_DCHECK_LT(bit, kBits);
71
71
  return p_ & (1 << bit);
72
72
  }
73
73
 
@@ -30,13 +30,13 @@
30
30
  #include "src/core/util/json/json.h"
31
31
  #include "src/core/util/json/json_args.h"
32
32
  #include "src/core/util/json/json_object_loader.h"
33
- #include "src/core/util/ref_counted_ptr.h"
34
33
  #include "src/core/util/validation_errors.h"
35
34
  #include "src/core/xds/grpc/certificate_provider_store.h"
36
35
  #include "src/core/xds/grpc/xds_audit_logger_registry.h"
37
36
  #include "src/core/xds/grpc/xds_cluster_specifier_plugin.h"
38
37
  #include "src/core/xds/grpc/xds_http_filter_registry.h"
39
38
  #include "src/core/xds/grpc/xds_lb_policy_registry.h"
39
+ #include "src/core/xds/grpc/xds_matcher_input.h"
40
40
  #include "src/core/xds/grpc/xds_server_grpc.h"
41
41
  #include "src/core/xds/xds_client/xds_bootstrap.h"
42
42
 
@@ -148,6 +148,10 @@ class GrpcXdsBootstrap final : public XdsBootstrap {
148
148
  const XdsAuditLoggerRegistry& audit_logger_registry() const {
149
149
  return audit_logger_registry_;
150
150
  }
151
+ const XdsMatcherInputRegistry<absl::string_view>&
152
+ matcher_string_input_registry() const {
153
+ return matcher_string_input_registry_;
154
+ }
151
155
 
152
156
  // Exposed for testing purposes only.
153
157
  const std::map<std::string, GrpcAuthority>& authorities() const {
@@ -165,6 +169,7 @@ class GrpcXdsBootstrap final : public XdsBootstrap {
165
169
  XdsClusterSpecifierPluginRegistry cluster_specifier_plugin_registry_;
166
170
  XdsLbPolicyRegistry lb_policy_registry_;
167
171
  XdsAuditLoggerRegistry audit_logger_registry_;
172
+ XdsMatcherInputRegistry<absl::string_view> matcher_string_input_registry_;
168
173
  };
169
174
 
170
175
  } // namespace grpc_core
@@ -24,10 +24,10 @@
24
24
  #include <utility>
25
25
 
26
26
  #include "absl/functional/bind_front.h"
27
- #include "absl/log/check.h"
28
27
  #include "src/core/credentials/transport/tls/ssl_utils.h"
29
28
  #include "src/core/lib/channel/channel_args.h"
30
29
  #include "src/core/lib/iomgr/error.h"
30
+ #include "src/core/util/grpc_check.h"
31
31
 
32
32
  namespace grpc_core {
33
33
 
@@ -185,7 +185,7 @@ void XdsCertificateProvider::WatchStatusCallback(std::string cert_name,
185
185
  }
186
186
  } else if (!root_being_watched && root_cert_watcher_ != nullptr) {
187
187
  // Cancel root cert watch.
188
- CHECK(root_cert_provider_ != nullptr);
188
+ GRPC_CHECK(root_cert_provider_ != nullptr);
189
189
  root_cert_provider_->distributor()->CancelTlsCertificatesWatch(
190
190
  root_cert_watcher_);
191
191
  root_cert_watcher_ = nullptr;
@@ -205,7 +205,7 @@ void XdsCertificateProvider::WatchStatusCallback(std::string cert_name,
205
205
  std::move(watcher), std::nullopt, identity_cert_name_);
206
206
  }
207
207
  } else if (!identity_being_watched && identity_cert_watcher_ != nullptr) {
208
- CHECK(identity_cert_provider_ != nullptr);
208
+ GRPC_CHECK(identity_cert_provider_ != nullptr);
209
209
  identity_cert_provider_->distributor()->CancelTlsCertificatesWatch(
210
210
  identity_cert_watcher_);
211
211
  identity_cert_watcher_ = nullptr;
@@ -192,8 +192,11 @@ const grpc_channel_args* g_channel_args ABSL_GUARDED_BY(*g_mu) = nullptr;
192
192
  NoDestruct<std::map<absl::string_view, GrpcXdsClient*>> g_xds_client_map
193
193
  ABSL_GUARDED_BY(*g_mu);
194
194
  char* g_fallback_bootstrap_config ABSL_GUARDED_BY(*g_mu) = nullptr;
195
+ NoDestruct<std::shared_ptr<GrpcXdsBootstrap>> g_parsed_bootstrap
196
+ ABSL_GUARDED_BY(*g_mu);
195
197
 
196
- absl::StatusOr<std::string> GetBootstrapContents(const char* fallback_config) {
198
+ absl::StatusOr<std::string> FindBootstrapContents()
199
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(*g_mu) {
197
200
  // First, try GRPC_XDS_BOOTSTRAP env var.
198
201
  auto path = GetEnv("GRPC_XDS_BOOTSTRAP");
199
202
  if (path.has_value()) {
@@ -214,10 +217,10 @@ absl::StatusOr<std::string> GetBootstrapContents(const char* fallback_config) {
214
217
  return std::move(*env_config);
215
218
  }
216
219
  // Finally, try fallback config.
217
- if (fallback_config != nullptr) {
220
+ if (g_fallback_bootstrap_config != nullptr) {
218
221
  GRPC_TRACE_LOG(xds_client, INFO)
219
222
  << "Got bootstrap contents from fallback config";
220
- return fallback_config;
223
+ return g_fallback_bootstrap_config;
221
224
  }
222
225
  // No bootstrap config found.
223
226
  return absl::FailedPreconditionError(
@@ -225,6 +228,22 @@ absl::StatusOr<std::string> GetBootstrapContents(const char* fallback_config) {
225
228
  "not defined");
226
229
  }
227
230
 
231
+ absl::StatusOr<std::shared_ptr<GrpcXdsBootstrap>> GetOrCreateGlobalBootstrap()
232
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(*g_mu) {
233
+ if (*g_parsed_bootstrap == nullptr) {
234
+ // First, find bootstrap contents.
235
+ auto bootstrap_contents = FindBootstrapContents();
236
+ if (!bootstrap_contents.ok()) return bootstrap_contents.status();
237
+ GRPC_TRACE_LOG(xds_client, INFO)
238
+ << "xDS bootstrap contents: " << *bootstrap_contents;
239
+ // Parse bootstrap.
240
+ auto bootstrap = GrpcXdsBootstrap::Create(*bootstrap_contents);
241
+ if (!bootstrap.ok()) return bootstrap.status();
242
+ *g_parsed_bootstrap = std::move(*bootstrap);
243
+ }
244
+ return *g_parsed_bootstrap;
245
+ }
246
+
228
247
  std::shared_ptr<GlobalStatsPluginRegistry::StatsPluginGroup>
229
248
  GetStatsPluginGroupForKeyAndChannelArgs(absl::string_view key,
230
249
  const ChannelArgs& channel_args) {
@@ -245,7 +264,8 @@ GetStatsPluginGroupForKeyAndChannelArgs(absl::string_view key,
245
264
  } // namespace
246
265
 
247
266
  absl::StatusOr<RefCountedPtr<GrpcXdsClient>> GrpcXdsClient::GetOrCreate(
248
- absl::string_view key, const ChannelArgs& args, const char* reason) {
267
+ absl::string_view key, const ChannelArgs& args, const char* reason,
268
+ std::shared_ptr<GrpcXdsBootstrap> bootstrap_override) {
249
269
  // If getting bootstrap from channel args, create a local XdsClient
250
270
  // instance for the channel or server instead of using the global instance.
251
271
  std::optional<absl::string_view> bootstrap_config = args.GetString(
@@ -273,19 +293,16 @@ absl::StatusOr<RefCountedPtr<GrpcXdsClient>> GrpcXdsClient::GetOrCreate(
273
293
  return xds_client.TakeAsSubclass<GrpcXdsClient>();
274
294
  }
275
295
  }
276
- // It doesn't exist, so we'll create it.
277
- // First, find bootstrap contents.
278
- auto bootstrap_contents = GetBootstrapContents(g_fallback_bootstrap_config);
279
- if (!bootstrap_contents.ok()) return bootstrap_contents.status();
280
- GRPC_TRACE_LOG(xds_client, INFO)
281
- << "xDS bootstrap contents: " << *bootstrap_contents;
282
- // Parse bootstrap.
283
- auto bootstrap = GrpcXdsBootstrap::Create(*bootstrap_contents);
284
- if (!bootstrap.ok()) return bootstrap.status();
285
- // Instantiate XdsClient.
296
+ // The XdsClient doesn't exist, so we'll create it.
297
+ std::shared_ptr<GrpcXdsBootstrap> bootstrap = std::move(bootstrap_override);
298
+ if (bootstrap == nullptr) {
299
+ auto global_bootstrap = GetOrCreateGlobalBootstrap();
300
+ if (!global_bootstrap.ok()) return global_bootstrap.status();
301
+ bootstrap = std::move(*global_bootstrap);
302
+ }
286
303
  auto channel_args = ChannelArgs::FromC(g_channel_args);
287
304
  auto xds_client = MakeRefCounted<GrpcXdsClient>(
288
- key, std::move(*bootstrap), channel_args,
305
+ key, std::move(bootstrap), channel_args,
289
306
  MakeRefCounted<GrpcXdsTransportFactory>(channel_args),
290
307
  GetStatsPluginGroupForKeyAndChannelArgs(key, args));
291
308
  g_xds_client_map->emplace(xds_client->key(), xds_client.get());
@@ -347,6 +364,7 @@ void GrpcXdsClient::Orphaned() {
347
364
  auto it = g_xds_client_map->find(key_);
348
365
  if (it != g_xds_client_map->end() && it->second == this) {
349
366
  g_xds_client_map->erase(it);
367
+ if (g_xds_client_map->empty()) g_parsed_bootstrap->reset();
350
368
  }
351
369
  }
352
370
 
@@ -430,6 +448,7 @@ void SetXdsChannelArgsForTest(grpc_channel_args* args) {
430
448
  void UnsetGlobalXdsClientsForTest() {
431
449
  MutexLock lock(g_mu);
432
450
  g_xds_client_map->clear();
451
+ g_parsed_bootstrap->reset();
433
452
  }
434
453
 
435
454
  void SetXdsFallbackBootstrapConfig(const char* config) {
@@ -45,8 +45,11 @@ class GrpcXdsClient final : public XdsClient {
45
45
  static constexpr absl::string_view kServerKey = "#server";
46
46
 
47
47
  // Factory function to get or create the global XdsClient instance.
48
+ // If bootstrap_override is null, the default bootstrap is used based
49
+ // on environment variables, channel args, etc.
48
50
  static absl::StatusOr<RefCountedPtr<GrpcXdsClient>> GetOrCreate(
49
- absl::string_view key, const ChannelArgs& args, const char* reason);
51
+ absl::string_view key, const ChannelArgs& args, const char* reason,
52
+ std::shared_ptr<GrpcXdsBootstrap> bootstrap_override = nullptr);
50
53
 
51
54
  // Do not instantiate directly -- use GetOrCreate() instead.
52
55
  // TODO(roth): The transport factory is injectable here to support