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
@@ -51,6 +51,7 @@
51
51
  #include "src/core/client_channel/client_channel_internal.h"
52
52
  #include "src/core/client_channel/config_selector.h"
53
53
  #include "src/core/config/core_configuration.h"
54
+ #include "src/core/filter/blackboard.h"
54
55
  #include "src/core/lib/channel/channel_args.h"
55
56
  #include "src/core/lib/channel/channel_fwd.h"
56
57
  #include "src/core/lib/channel/channel_stack.h"
@@ -274,12 +275,16 @@ class XdsResolver final : public Resolver {
274
275
 
275
276
  absl::Status GetCallConfig(GetCallConfigArgs args) override;
276
277
 
277
- void AddFilters(InterceptionChainBuilder& builder) override;
278
+ void AddFilters(InterceptionChainBuilder& builder,
279
+ const Blackboard* old_blackboard,
280
+ Blackboard* new_blackboard) override;
278
281
 
279
- std::vector<const grpc_channel_filter*> GetFilters() override;
282
+ std::vector<const grpc_channel_filter*> GetFilters(
283
+ const Blackboard* old_blackboard, Blackboard* new_blackboard) override;
280
284
 
281
285
  private:
282
286
  RefCountedPtr<XdsResolver> resolver_;
287
+ std::shared_ptr<const XdsListenerResource> listener_;
283
288
  RefCountedPtr<RouteConfigData> route_config_data_;
284
289
  std::vector<const XdsHttpFilterImpl*> filters_;
285
290
  };
@@ -517,7 +522,7 @@ absl::Status XdsResolver::RouteConfigData::AddRouteEntry(
517
522
  XdsResolver* resolver, const XdsRouteConfigResource::Route& route,
518
523
  const Duration& default_max_stream_duration) {
519
524
  GRPC_TRACE_LOG(xds_resolver, INFO)
520
- << "[xds_resolver " << resolver << "] XdsConfigSelector " << this
525
+ << "[xds_resolver " << resolver << "] RouteConfigData " << this
521
526
  << ": route: " << route.ToString();
522
527
  routes_.emplace_back(route);
523
528
  auto* route_entry = &routes_.back();
@@ -606,18 +611,19 @@ XdsResolver::XdsConfigSelector::XdsConfigSelector(
606
611
  RefCountedPtr<XdsResolver> resolver,
607
612
  RefCountedPtr<RouteConfigData> route_config_data)
608
613
  : resolver_(std::move(resolver)),
614
+ listener_(resolver_->current_config_->listener),
609
615
  route_config_data_(std::move(route_config_data)) {
610
616
  GRPC_TRACE_LOG(xds_resolver, INFO) << "[xds_resolver " << resolver_.get()
611
617
  << "] creating XdsConfigSelector " << this;
612
618
  // Populate filter list.
613
619
  const auto& http_filter_registry =
614
- static_cast<const GrpcXdsBootstrap&>(resolver_->xds_client_->bootstrap())
620
+ DownCast<const GrpcXdsBootstrap&>(resolver_->xds_client_->bootstrap())
615
621
  .http_filter_registry();
616
- const auto& hcm = std::get<XdsListenerResource::HttpConnectionManager>(
617
- resolver_->current_config_->listener->listener);
622
+ const auto& hcm =
623
+ std::get<XdsListenerResource::HttpConnectionManager>(listener_->listener);
618
624
  for (const auto& http_filter : hcm.http_filters) {
619
625
  // Find filter. This is guaranteed to succeed, because it's checked
620
- // at config validation time in the XdsApi code.
626
+ // at config validation time.
621
627
  const XdsHttpFilterImpl* filter_impl =
622
628
  http_filter_registry.GetFilterForType(
623
629
  http_filter.config.config_proto_type_name);
@@ -771,20 +777,34 @@ absl::Status XdsResolver::XdsConfigSelector::GetCallConfig(
771
777
  }
772
778
 
773
779
  void XdsResolver::XdsConfigSelector::AddFilters(
774
- InterceptionChainBuilder& builder) {
775
- for (const XdsHttpFilterImpl* filter : filters_) {
780
+ InterceptionChainBuilder& builder, const Blackboard* old_blackboard,
781
+ Blackboard* new_blackboard) {
782
+ const auto& hcm =
783
+ std::get<XdsListenerResource::HttpConnectionManager>(listener_->listener);
784
+ CHECK_EQ(filters_.size(), hcm.http_filters.size());
785
+ for (size_t i = 0; i < filters_.size(); ++i) {
786
+ auto* filter = filters_[i];
776
787
  filter->AddFilter(builder);
788
+ filter->UpdateBlackboard(hcm.http_filters[i].config, old_blackboard,
789
+ new_blackboard);
777
790
  }
778
791
  builder.Add<ClusterSelectionFilter>();
779
792
  }
780
793
 
781
794
  std::vector<const grpc_channel_filter*>
782
- XdsResolver::XdsConfigSelector::GetFilters() {
795
+ XdsResolver::XdsConfigSelector::GetFilters(const Blackboard* old_blackboard,
796
+ Blackboard* new_blackboard) {
797
+ const auto& hcm =
798
+ std::get<XdsListenerResource::HttpConnectionManager>(listener_->listener);
799
+ CHECK_EQ(filters_.size(), hcm.http_filters.size());
783
800
  std::vector<const grpc_channel_filter*> filters;
784
- for (const XdsHttpFilterImpl* filter : filters_) {
801
+ for (size_t i = 0; i < filters_.size(); ++i) {
802
+ auto* filter = filters_[i];
785
803
  if (filter->channel_filter() != nullptr) {
786
804
  filters.push_back(filter->channel_filter());
787
805
  }
806
+ filter->UpdateBlackboard(hcm.http_filters[i].config, old_blackboard,
807
+ new_blackboard);
788
808
  }
789
809
  filters.push_back(&ClusterSelectionFilter::kFilter);
790
810
  return filters;
@@ -48,6 +48,7 @@
48
48
  #include "src/core/call/server_call.h"
49
49
  #include "src/core/channelz/channel_trace.h"
50
50
  #include "src/core/channelz/channelz.h"
51
+ #include "src/core/channelz/property_list.h"
51
52
  #include "src/core/config/core_configuration.h"
52
53
  #include "src/core/credentials/transport/transport_credentials.h"
53
54
  #include "src/core/lib/address_utils/sockaddr_utils.h"
@@ -105,6 +106,16 @@ void Server::ListenerState::ConfigFetcherWatcher::UpdateConnectionManager(
105
106
  if (listener_state_->server_->ShutdownCalled()) {
106
107
  return;
107
108
  }
109
+ RefCountedPtr<Blackboard> new_blackboard;
110
+ for (auto& blackboard_shard : listener_state_->blackboards_) {
111
+ MutexLock lock(&blackboard_shard.mu);
112
+ if (new_blackboard == nullptr) {
113
+ new_blackboard = MakeRefCounted<Blackboard>();
114
+ listener_state_->connection_manager_->UpdateBlackboard(
115
+ blackboard_shard.blackboard.get(), new_blackboard.get());
116
+ }
117
+ blackboard_shard.blackboard = new_blackboard;
118
+ }
108
119
  listener_state_->is_serving_ = true;
109
120
  if (listener_state_->started_) return;
110
121
  listener_state_->started_ = true;
@@ -131,7 +142,8 @@ Server::ListenerState::ListenerState(RefCountedPtr<Server> server,
131
142
  event_engine_(
132
143
  server_->channel_args()
133
144
  .GetObject<grpc_event_engine::experimental::EventEngine>()),
134
- listener_(std::move(l)) {
145
+ listener_(std::move(l)),
146
+ blackboards_(PerCpuOptions().SetMaxShards(16)) {
135
147
  auto max_allowed_incoming_connections =
136
148
  server_->channel_args().GetInt(GRPC_ARG_MAX_ALLOWED_INCOMING_CONNECTIONS);
137
149
  if (max_allowed_incoming_connections.has_value()) {
@@ -277,6 +289,19 @@ void Server::ListenerState::RemoveLogicalConnection(
277
289
  }
278
290
  }
279
291
 
292
+ grpc_error_handle Server::ListenerState::SetupTransport(
293
+ Transport* transport, grpc_pollset* accepting_pollset,
294
+ const ChannelArgs& args) {
295
+ RefCountedPtr<Blackboard> blackboard;
296
+ {
297
+ auto& blackboard_shard = blackboards_.this_cpu();
298
+ MutexLock lock(&blackboard_shard.mu);
299
+ blackboard = blackboard_shard.blackboard;
300
+ }
301
+ return server_->SetupTransport(transport, accepting_pollset, args,
302
+ blackboard.get());
303
+ }
304
+
280
305
  void Server::ListenerState::DrainConnectionsLocked() {
281
306
  if (connections_.empty()) {
282
307
  return;
@@ -1060,9 +1085,7 @@ RefCountedPtr<channelz::ServerNode> CreateChannelzNode(
1060
1085
  .value_or(GRPC_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE_DEFAULT));
1061
1086
  channelz_node =
1062
1087
  MakeRefCounted<channelz::ServerNode>(channel_tracer_max_memory);
1063
- channelz_node->AddTraceEvent(
1064
- channelz::ChannelTrace::Severity::Info,
1065
- grpc_slice_from_static_string("Server created"));
1088
+ GRPC_CHANNELZ_LOG(channelz_node) << "Server created";
1066
1089
  channelz_node->SetChannelArgs(args);
1067
1090
  }
1068
1091
  return channelz_node;
@@ -1151,8 +1174,9 @@ auto Server::MatchAndPublishCall(CallHandler call_handler) {
1151
1174
  }
1152
1175
 
1153
1176
  absl::StatusOr<RefCountedPtr<UnstartedCallDestination>>
1154
- Server::MakeCallDestination(const ChannelArgs& args) {
1155
- InterceptionChainBuilder builder(args);
1177
+ Server::MakeCallDestination(const ChannelArgs& args,
1178
+ const Blackboard* blackboard) {
1179
+ InterceptionChainBuilder builder(args, blackboard);
1156
1180
  // TODO(ctiller): find a way to avoid adding a server ref per call
1157
1181
  builder.AddOnClientInitialMetadata([self = Ref()](ClientMetadata& md) {
1158
1182
  self->SetRegisteredMethodOnMetadata(md);
@@ -1166,16 +1190,23 @@ Server::MakeCallDestination(const ChannelArgs& args) {
1166
1190
  }
1167
1191
 
1168
1192
  Server::Server(const ChannelArgs& args)
1169
- : channel_args_(args),
1170
- channelz_node_(CreateChannelzNode(args)),
1193
+ : channelz::DataSource(CreateChannelzNode(args)),
1194
+ channel_args_(args),
1195
+ channelz_node_(channelz::DataSource::channelz_node() == nullptr
1196
+ ? nullptr
1197
+ : channelz::DataSource::channelz_node()
1198
+ ->RefAsSubclass<channelz::ServerNode>()),
1171
1199
  server_call_tracer_factory_(ServerCallTracerFactory::Get(args)),
1172
1200
  compression_options_(CompressionOptionsFromChannelArgs(args)),
1173
1201
  max_time_in_pending_queue_(Duration::Seconds(
1174
1202
  channel_args_
1175
1203
  .GetInt(GRPC_ARG_SERVER_MAX_UNREQUESTED_TIME_IN_SERVER_SECONDS)
1176
- .value_or(30))) {}
1204
+ .value_or(30))) {
1205
+ SourceConstructed();
1206
+ }
1177
1207
 
1178
1208
  Server::~Server() {
1209
+ SourceDestructing();
1179
1210
  // Remove the cq pollsets from the config_fetcher.
1180
1211
  if (started_ && config_fetcher_ != nullptr &&
1181
1212
  config_fetcher_->interested_parties() != nullptr) {
@@ -1189,6 +1220,44 @@ Server::~Server() {
1189
1220
  }
1190
1221
  }
1191
1222
 
1223
+ void Server::AddData(channelz::DataSink sink) {
1224
+ MutexLock global_lock(&mu_global_);
1225
+ sink.AddData(
1226
+ "server",
1227
+ channelz::PropertyList()
1228
+ // TODO(ctiller): config_fetcher?
1229
+ // TODO(ctiller): server_call_tracer_factory?
1230
+ // TODO(ctiller): compression_options?
1231
+ // TODO(ctiller): unregistered_request_matcher?
1232
+ // TODO(ctiller): connection_manager?
1233
+ .Set("registered_cqs", cqs_.size())
1234
+ .Set("pollsets", pollsets_.size())
1235
+ .Set("started", started_)
1236
+ .Set("starting", starting_)
1237
+ .Set("registered_methods",
1238
+ [this]() {
1239
+ channelz::PropertyGrid grid;
1240
+ for (auto& [host_method, rm] : registered_methods_) {
1241
+ grid.Set("host", host_method.second, host_method.first)
1242
+ .Set("payload_handling", host_method.second,
1243
+ rm->payload_handling ==
1244
+ GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER
1245
+ ? "READ_INITIAL_BYTE_BUFFER"
1246
+ : "PAYLOAD_NONE");
1247
+ }
1248
+ return grid;
1249
+ }())
1250
+ .Set("shutdown_refs", shutdown_refs_.load(std::memory_order_relaxed))
1251
+ .Set("shutdown_published", shutdown_published_)
1252
+ .Set("num_shutdown_tags", shutdown_tags_.size())
1253
+ .Set("max_time_in_pending_queue", max_time_in_pending_queue_)
1254
+ .Set("num_channels", channels_.size())
1255
+ .Set("num_connections", connections_.size())
1256
+ .Set("connections_open", connections_open_)
1257
+ .Set("num_listener_states", listener_states_.size())
1258
+ .Set("listeners_destroyed", listeners_destroyed_));
1259
+ }
1260
+
1192
1261
  void Server::AddListener(OrphanablePtr<ListenerInterface> listener) {
1193
1262
  channelz::ListenSocketNode* listen_socket_node =
1194
1263
  listener->channelz_listen_socket_node();
@@ -1240,7 +1309,8 @@ void Server::Start() {
1240
1309
 
1241
1310
  grpc_error_handle Server::SetupTransport(Transport* transport,
1242
1311
  grpc_pollset* accepting_pollset,
1243
- const ChannelArgs& args) {
1312
+ const ChannelArgs& args,
1313
+ const Blackboard* blackboard) {
1244
1314
  GRPC_LATENT_SEE_INNER_SCOPE("Server::SetupTransport");
1245
1315
  // Create channel.
1246
1316
  global_stats().IncrementServerChannelsCreated();
@@ -1252,7 +1322,8 @@ grpc_error_handle Server::SetupTransport(Transport* transport,
1252
1322
  OrphanablePtr<ServerTransport> t(transport->server_transport());
1253
1323
  auto destination = MakeCallDestination(
1254
1324
  args.SetObject(transport).SetObject<channelz::BaseNode>(
1255
- transport->GetSocketNode()));
1325
+ transport->GetSocketNode()),
1326
+ blackboard);
1256
1327
  if (!destination.ok()) {
1257
1328
  return absl_status_to_grpc_error(destination.status());
1258
1329
  }
@@ -1275,7 +1346,7 @@ grpc_error_handle Server::SetupTransport(Transport* transport,
1275
1346
  "",
1276
1347
  args.SetObject(transport).SetObject<channelz::BaseNode>(
1277
1348
  transport->GetSocketNode()),
1278
- GRPC_SERVER_CHANNEL);
1349
+ GRPC_SERVER_CHANNEL, blackboard);
1279
1350
  if (!channel.ok()) {
1280
1351
  return absl_status_to_grpc_error(channel.status());
1281
1352
  }
@@ -45,6 +45,7 @@
45
45
  #include "absl/strings/string_view.h"
46
46
  #include "src/core/call/metadata_batch.h"
47
47
  #include "src/core/channelz/channelz.h"
48
+ #include "src/core/filter/blackboard.h"
48
49
  #include "src/core/lib/channel/channel_args.h"
49
50
  #include "src/core/lib/channel/channel_fwd.h"
50
51
  #include "src/core/lib/channel/channel_stack.h"
@@ -66,6 +67,7 @@
66
67
  #include "src/core/util/cpp_impl_of.h"
67
68
  #include "src/core/util/dual_ref_counted.h"
68
69
  #include "src/core/util/orphanable.h"
70
+ #include "src/core/util/per_cpu.h"
69
71
  #include "src/core/util/random_early_detection.h"
70
72
  #include "src/core/util/ref_counted_ptr.h"
71
73
  #include "src/core/util/sync.h"
@@ -86,6 +88,9 @@ class ServerConfigFetcher
86
88
  virtual absl::StatusOr<grpc_core::ChannelArgs>
87
89
  UpdateChannelArgsForConnection(const grpc_core::ChannelArgs& args,
88
90
  grpc_endpoint* tcp) = 0;
91
+
92
+ virtual void UpdateBlackboard(const Blackboard* old_blackboard,
93
+ Blackboard* new_blackboard) = 0;
89
94
  };
90
95
 
91
96
  class WatcherInterface {
@@ -120,6 +125,7 @@ class ListenerStateTestPeer;
120
125
 
121
126
  class Server : public ServerInterface,
122
127
  public InternallyRefCounted<Server>,
128
+ public channelz::DataSource,
123
129
  public CppImplOf<Server, grpc_server> {
124
130
  public:
125
131
  // Filter vtable.
@@ -246,6 +252,10 @@ class Server : public ServerInterface,
246
252
  void RemoveLogicalConnection(
247
253
  ListenerInterface::LogicalConnection* connection);
248
254
 
255
+ grpc_error_handle SetupTransport(Transport* transport,
256
+ grpc_pollset* accepting_pollset,
257
+ const ChannelArgs& args);
258
+
249
259
  const MemoryQuotaRefPtr& memory_quota() const { return memory_quota_; }
250
260
 
251
261
  const ConnectionQuotaRefPtr& connection_quota() const {
@@ -282,6 +292,11 @@ class Server : public ServerInterface,
282
292
  grpc_core::Timestamp timestamp;
283
293
  };
284
294
 
295
+ struct BlackboardShard {
296
+ Mutex mu;
297
+ RefCountedPtr<Blackboard> blackboard ABSL_GUARDED_BY(&mu);
298
+ };
299
+
285
300
  void DrainConnectionsLocked() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
286
301
 
287
302
  void OnDrainGraceTimer();
@@ -299,6 +314,7 @@ class Server : public ServerInterface,
299
314
  OrphanablePtr<ListenerInterface> listener_;
300
315
  grpc_closure destroy_done_;
301
316
  ConfigFetcherWatcher* config_fetcher_watcher_ = nullptr;
317
+ PerCpu<BlackboardShard> blackboards_;
302
318
  Mutex mu_; // We could share this mutex with Listener implementations. It's
303
319
  // a tradeoff between increased memory requirement and more
304
320
  // granular critical regions.
@@ -318,6 +334,8 @@ class Server : public ServerInterface,
318
334
  explicit Server(const ChannelArgs& args);
319
335
  ~Server() override;
320
336
 
337
+ void AddData(channelz::DataSink sink) override;
338
+
321
339
  void Orphan() ABSL_LOCKS_EXCLUDED(mu_global_) override;
322
340
 
323
341
  const ChannelArgs& channel_args() const override { return channel_args_; }
@@ -355,7 +373,8 @@ class Server : public ServerInterface,
355
373
  // Takes ownership of a ref on resource_user from the caller.
356
374
  grpc_error_handle SetupTransport(Transport* transport,
357
375
  grpc_pollset* accepting_pollset,
358
- const ChannelArgs& args)
376
+ const ChannelArgs& args,
377
+ const Blackboard* blackboard = nullptr)
359
378
  ABSL_LOCKS_EXCLUDED(mu_global_);
360
379
 
361
380
  void RegisterCompletionQueue(grpc_completion_queue* cq);
@@ -641,7 +660,7 @@ class Server : public ServerInterface,
641
660
  ClientMetadataHandle md);
642
661
  auto MatchAndPublishCall(CallHandler call_handler);
643
662
  absl::StatusOr<RefCountedPtr<UnstartedCallDestination>> MakeCallDestination(
644
- const ChannelArgs& args);
663
+ const ChannelArgs& args, const Blackboard* blackboard);
645
664
 
646
665
  ChannelArgs const channel_args_;
647
666
  RefCountedPtr<channelz::ServerNode> channelz_node_;
@@ -70,6 +70,7 @@
70
70
  #include "src/core/service_config/service_config.h"
71
71
  #include "src/core/service_config/service_config_impl.h"
72
72
  #include "src/core/util/debug_location.h"
73
+ #include "src/core/util/down_cast.h"
73
74
  #include "src/core/util/host_port.h"
74
75
  #include "src/core/util/match.h"
75
76
  #include "src/core/util/ref_counted_ptr.h"
@@ -210,6 +211,9 @@ class XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager final
210
211
  absl::StatusOr<ChannelArgs> UpdateChannelArgsForConnection(
211
212
  const ChannelArgs& args, grpc_endpoint* tcp) override;
212
213
 
214
+ void UpdateBlackboard(const Blackboard* old_blackboard,
215
+ Blackboard* new_blackboard) override;
216
+
213
217
  // Invoked by ListenerWatcher to start fetching referenced RDS resources.
214
218
  void StartRdsWatch(RefCountedPtr<ListenerWatcher> listener_watcher)
215
219
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&ListenerWatcher::mu_);
@@ -248,6 +252,10 @@ class XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager final
248
252
  route_config);
249
253
  void OnAmbientError(const std::string& resource_name, absl::Status status);
250
254
 
255
+ // Executes cb once for each unique filter chain object in the LDS resource.
256
+ void ForEachFilterChain(
257
+ absl::FunctionRef<void(XdsListenerResource::FilterChainData&)> cb);
258
+
251
259
  RefCountedPtr<GrpcXdsClient> xds_client_;
252
260
  // This ref is only kept around till the FilterChainMatchManager becomes
253
261
  // ready.
@@ -402,7 +410,7 @@ class XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
402
410
  return static_resource_.status();
403
411
  }
404
412
  return XdsServerConfigSelector::Create(
405
- static_cast<const GrpcXdsBootstrap&>(xds_client_->bootstrap())
413
+ DownCast<const GrpcXdsBootstrap&>(xds_client_->bootstrap())
406
414
  .http_filter_registry(),
407
415
  static_resource_.value(), http_filters_);
408
416
  }
@@ -529,7 +537,7 @@ void XdsServerConfigFetcher::StartWatch(
529
537
  XdsListenerResourceType::StartWatch(
530
538
  xds_client_.get(),
531
539
  ListenerResourceName(
532
- static_cast<const GrpcXdsBootstrap&>(xds_client_->bootstrap())
540
+ DownCast<const GrpcXdsBootstrap&>(xds_client_->bootstrap())
533
541
  .server_listener_resource_name_template(),
534
542
  listening_address),
535
543
  std::move(listener_watcher));
@@ -546,7 +554,7 @@ void XdsServerConfigFetcher::CancelWatch(
546
554
  XdsListenerResourceType::CancelWatch(
547
555
  xds_client_.get(),
548
556
  ListenerResourceName(
549
- static_cast<const GrpcXdsBootstrap&>(xds_client_->bootstrap())
557
+ DownCast<const GrpcXdsBootstrap&>(xds_client_->bootstrap())
550
558
  .server_listener_resource_name_template(),
551
559
  it->second->listening_address()),
552
560
  it->second, false /* delay_unsubscription */);
@@ -685,37 +693,47 @@ XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
685
693
  default_filter_chain_(std::move(default_filter_chain)) {}
686
694
 
687
695
  void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
688
- StartRdsWatch(RefCountedPtr<ListenerWatcher> listener_watcher) {
689
- // Get the set of RDS resources to watch on. Also get the set of
690
- // FilterChainData so that we can reverse the list of HTTP filters since
691
- // received data moves *up* the stack in Core.
692
- std::set<std::string> resource_names;
696
+ ForEachFilterChain(
697
+ absl::FunctionRef<void(XdsListenerResource::FilterChainData&)> cb) {
698
+ // A given FilterChainData object may appear more than once in the map,
699
+ // but we want to invoke the callback exactly once for each
700
+ // FilterChainData object. Therefore, we start by constructing a set
701
+ // of all FilterChainData objects by address, to weed out duplicates.
693
702
  std::set<XdsListenerResource::FilterChainData*> filter_chain_data_set;
694
703
  for (const auto& destination_ip : filter_chain_map_.destination_ip_vector) {
695
704
  for (const auto& source_type : destination_ip.source_types_array) {
696
705
  for (const auto& source_ip : source_type) {
697
706
  for (const auto& source_port_pair : source_ip.ports_map) {
698
707
  auto* filter_chain_data = source_port_pair.second.data.get();
699
- const auto* rds_name = std::get_if<std::string>(
700
- &filter_chain_data->http_connection_manager.route_config);
701
- if (rds_name != nullptr) resource_names.insert(*rds_name);
702
708
  filter_chain_data_set.insert(filter_chain_data);
703
709
  }
704
710
  }
705
711
  }
706
712
  }
707
- if (default_filter_chain_.has_value()) {
708
- auto& hcm = default_filter_chain_->http_connection_manager;
709
- const auto* rds_name = std::get_if<std::string>(&hcm.route_config);
710
- if (rds_name != nullptr) resource_names.insert(*rds_name);
711
- std::reverse(hcm.http_filters.begin(), hcm.http_filters.end());
712
- }
713
- // Reverse the lists of HTTP filters in all the filter chains
713
+ // Invoke the callback once for each FilterChainData object.
714
714
  for (auto* filter_chain_data : filter_chain_data_set) {
715
- auto& hcm = filter_chain_data->http_connection_manager;
716
- std::reverse(hcm.http_filters.begin(), hcm.http_filters.end());
715
+ cb(*filter_chain_data);
717
716
  }
718
- // Start watching on referenced RDS resources
717
+ // Also invoke the callback for the default filter chain, if present.
718
+ if (default_filter_chain_.has_value()) {
719
+ cb(*default_filter_chain_);
720
+ }
721
+ }
722
+
723
+ void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
724
+ StartRdsWatch(RefCountedPtr<ListenerWatcher> listener_watcher) {
725
+ // Get the set of RDS resources to watch on. Also reverse the list of
726
+ // HTTP filters in each filter chain, since received data moves *up*
727
+ // the stack on the server side.
728
+ std::set<std::string> resource_names;
729
+ ForEachFilterChain(
730
+ [&](XdsListenerResource::FilterChainData& filter_chain_data) {
731
+ auto& hcm = filter_chain_data.http_connection_manager;
732
+ const auto* rds_name = std::get_if<std::string>(&hcm.route_config);
733
+ if (rds_name != nullptr) resource_names.insert(*rds_name);
734
+ std::reverse(hcm.http_filters.begin(), hcm.http_filters.end());
735
+ });
736
+ // Start watching referenced RDS resources.
719
737
  struct WatcherToStart {
720
738
  std::string resource_name;
721
739
  RefCountedPtr<RouteConfigWatcher> watcher;
@@ -1026,7 +1044,7 @@ absl::StatusOr<ChannelArgs> XdsServerConfigFetcher::ListenerWatcher::
1026
1044
  // flows *up* the stack.
1027
1045
  std::vector<const grpc_channel_filter*> filters;
1028
1046
  const auto& http_filter_registry =
1029
- static_cast<const GrpcXdsBootstrap&>(xds_client_->bootstrap())
1047
+ DownCast<const GrpcXdsBootstrap&>(xds_client_->bootstrap())
1030
1048
  .http_filter_registry();
1031
1049
  for (const auto& http_filter :
1032
1050
  filter_chain->http_connection_manager.http_filters) {
@@ -1090,6 +1108,26 @@ absl::StatusOr<ChannelArgs> XdsServerConfigFetcher::ListenerWatcher::
1090
1108
  return args;
1091
1109
  }
1092
1110
 
1111
+ void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
1112
+ UpdateBlackboard(const Blackboard* old_blackboard,
1113
+ Blackboard* new_blackboard) {
1114
+ const auto& http_filter_registry =
1115
+ DownCast<const GrpcXdsBootstrap&>(xds_client_->bootstrap())
1116
+ .http_filter_registry();
1117
+ ForEachFilterChain(
1118
+ [&](XdsListenerResource::FilterChainData& filter_chain_data) {
1119
+ auto& hcm = filter_chain_data.http_connection_manager;
1120
+ for (const auto& http_filter : hcm.http_filters) {
1121
+ const XdsHttpFilterImpl* filter_impl =
1122
+ http_filter_registry.GetFilterForType(
1123
+ http_filter.config.config_proto_type_name);
1124
+ CHECK_NE(filter_impl, nullptr); // Enforced in config validation.
1125
+ filter_impl->UpdateBlackboard(http_filter.config, old_blackboard,
1126
+ new_blackboard);
1127
+ }
1128
+ });
1129
+ }
1130
+
1093
1131
  //
1094
1132
  // XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::XdsServerConfigSelector
1095
1133
  //
@@ -1237,7 +1275,7 @@ XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
1237
1275
  return resource.status();
1238
1276
  }
1239
1277
  return XdsServerConfigSelector::Create(
1240
- static_cast<const GrpcXdsBootstrap&>(xds_client_->bootstrap())
1278
+ DownCast<const GrpcXdsBootstrap&>(xds_client_->bootstrap())
1241
1279
  .http_filter_registry(),
1242
1280
  resource.value(), http_filters_);
1243
1281
  }
@@ -1269,7 +1307,7 @@ void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
1269
1307
  watcher_->OnServerConfigSelectorUpdate(resource_.status());
1270
1308
  } else {
1271
1309
  watcher_->OnServerConfigSelectorUpdate(XdsServerConfigSelector::Create(
1272
- static_cast<const GrpcXdsBootstrap&>(xds_client_->bootstrap())
1310
+ DownCast<const GrpcXdsBootstrap&>(xds_client_->bootstrap())
1273
1311
  .http_filter_registry(),
1274
1312
  *resource_, http_filters_));
1275
1313
  }
@@ -1304,7 +1342,7 @@ grpc_server_config_fetcher* grpc_server_config_fetcher_xds_create(
1304
1342
  LOG(ERROR) << "Failed to create xds client: " << xds_client.status();
1305
1343
  return nullptr;
1306
1344
  }
1307
- if (static_cast<const grpc_core::GrpcXdsBootstrap&>(
1345
+ if (grpc_core::DownCast<const grpc_core::GrpcXdsBootstrap&>(
1308
1346
  (*xds_client)->bootstrap())
1309
1347
  .server_listener_resource_name_template()
1310
1348
  .empty()) {
@@ -72,7 +72,7 @@ class ServiceConfig : public RefCounted<ServiceConfig> {
72
72
  /// lifetime of the returned object is tied to the lifetime of the
73
73
  /// ServiceConfig object.
74
74
  virtual ServiceConfigParser::ParsedConfig* GetGlobalParsedConfig(
75
- size_t index) = 0;
75
+ size_t index) const = 0;
76
76
 
77
77
  /// Retrieves the vector of parsed configs for the method identified
78
78
  /// by \a path. The lifetime of the returned vector and contained objects
@@ -86,7 +86,7 @@ class ServiceConfigImpl final : public ServiceConfig {
86
86
  /// lifetime of the returned object is tied to the lifetime of the
87
87
  /// ServiceConfig object.
88
88
  ServiceConfigParser::ParsedConfig* GetGlobalParsedConfig(
89
- size_t index) override {
89
+ size_t index) const override {
90
90
  DCHECK(index < parsed_global_configs_.size());
91
91
  return parsed_global_configs_[index].get();
92
92
  }
@@ -0,0 +1,38 @@
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/telemetry/context_list_entry.h"
16
+
17
+ namespace grpc_core {
18
+
19
+ namespace {
20
+ CopyContextFn g_get_copied_context_fn = nullptr;
21
+ DeleteContextFn g_delete_copied_context_fn = nullptr;
22
+ } // namespace
23
+
24
+ void GrpcHttp2SetCopyContextFn(CopyContextFn fn) {
25
+ g_get_copied_context_fn = fn;
26
+ }
27
+
28
+ void GrpcHttp2SetDeleteContextFn(DeleteContextFn fn) {
29
+ g_delete_copied_context_fn = fn;
30
+ }
31
+
32
+ CopyContextFn GrpcHttp2GetCopyContextFn() { return g_get_copied_context_fn; }
33
+
34
+ DeleteContextFn GrpcHttp2GetDeleteContextFn() {
35
+ return g_delete_copied_context_fn;
36
+ }
37
+
38
+ } // namespace grpc_core