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
@@ -32,6 +32,7 @@
32
32
  #include <optional>
33
33
  #include <set>
34
34
  #include <string>
35
+ #include <type_traits>
35
36
  #include <utility>
36
37
 
37
38
  #include "absl/base/thread_annotations.h"
@@ -50,6 +51,7 @@
50
51
  #include "src/core/util/time.h"
51
52
  #include "src/core/util/time_precise.h"
52
53
  #include "src/core/util/useful.h"
54
+ #include "src/proto/grpc/channelz/v2/channelz.upb.h"
53
55
 
54
56
  // Channel arg key for channelz node.
55
57
  #define GRPC_ARG_CHANNELZ_CHANNEL_NODE \
@@ -80,6 +82,8 @@ namespace channelz {
80
82
  class SocketNode;
81
83
  class ListenSocketNode;
82
84
  class DataSource;
85
+ class DataSink;
86
+ class PropertyList;
83
87
  class ZTrace;
84
88
 
85
89
  namespace testing {
@@ -123,8 +127,42 @@ class BaseNode : public DualRefCounted<BaseNode> {
123
127
  return "unknown";
124
128
  }
125
129
 
130
+ static absl::string_view EntityTypeToKind(EntityType type) {
131
+ switch (type) {
132
+ case EntityType::kTopLevelChannel:
133
+ return "channel";
134
+ case EntityType::kInternalChannel:
135
+ return "internal_channel";
136
+ case EntityType::kSubchannel:
137
+ return "subchannel";
138
+ case EntityType::kServer:
139
+ return "server";
140
+ case EntityType::kListenSocket:
141
+ return "listen_socket";
142
+ case EntityType::kSocket:
143
+ return "socket";
144
+ case EntityType::kCall:
145
+ return "call";
146
+ }
147
+ }
148
+
149
+ static std::optional<EntityType> KindToEntityType(absl::string_view kind) {
150
+ if (kind == "channel") return EntityType::kTopLevelChannel;
151
+ if (kind == "internal_channel") return EntityType::kInternalChannel;
152
+ if (kind == "subchannel") return EntityType::kSubchannel;
153
+ if (kind == "server") return EntityType::kServer;
154
+ if (kind == "listen_socket") return EntityType::kListenSocket;
155
+ if (kind == "socket") return EntityType::kSocket;
156
+ if (kind == "call") return EntityType::kCall;
157
+ return std::nullopt;
158
+ }
159
+
126
160
  protected:
127
- BaseNode(EntityType type, std::string name);
161
+ BaseNode(EntityType type, size_t max_trace_memory, std::string name);
162
+
163
+ // Leaf derived types should call NodeConstructed() in their constructors
164
+ // to complete the initialization.
165
+ void NodeConstructed();
128
166
 
129
167
  public:
130
168
  void Orphaned() override;
@@ -173,8 +211,25 @@ class BaseNode : public DualRefCounted<BaseNode> {
173
211
  absl::AnyInvocable<void(Json output)> callback);
174
212
  Json::Object AdditionalInfo();
175
213
 
214
+ const ChannelTrace& trace() const { return trace_; }
215
+ template <typename... Args>
216
+ ChannelTrace::Node NewTraceNode(Args&&... args) {
217
+ return trace_.NewNode(std::forward<Args>(args)...);
218
+ }
219
+ ChannelTrace& mutable_trace() { return trace_; }
220
+
221
+ void SerializeEntity(grpc_channelz_v2_Entity* entity, upb_Arena* arena);
222
+
223
+ std::string SerializeEntityToString();
224
+
176
225
  protected:
177
226
  void PopulateJsonFromDataSources(Json::Object& json);
227
+ // V2: Add any node-specific data to the sink.
228
+ // This is information that used to be provided by overloaded RenderJson
229
+ // methods.
230
+ // Over time the hope is that we can eliminate this method and move all
231
+ // functionality into data sources.
232
+ virtual void AddNodeSpecificData(DataSink sink);
178
233
 
179
234
  private:
180
235
  // to allow the ChannelzRegistry to set uuid_ under its lock.
@@ -188,6 +243,7 @@ class BaseNode : public DualRefCounted<BaseNode> {
188
243
  intptr_t UuidSlow();
189
244
 
190
245
  const EntityType type_;
246
+ bool node_constructed_called_ = false;
191
247
  uint64_t orphaned_index_ = 0; // updated by registry
192
248
  std::atomic<intptr_t> uuid_;
193
249
  std::string name_;
@@ -198,8 +254,22 @@ class BaseNode : public DualRefCounted<BaseNode> {
198
254
  BaseNode* next_; // updated by registry
199
255
  mutable Mutex parent_mu_;
200
256
  ParentSet parents_ ABSL_GUARDED_BY(parent_mu_);
257
+ ChannelTrace trace_;
201
258
  };
202
259
 
260
+ namespace detail {
261
+ inline ChannelTrace* LogOutputFrom(BaseNode* n) {
262
+ if (n == nullptr) return nullptr;
263
+ return LogOutputFrom(n->mutable_trace());
264
+ }
265
+
266
+ template <typename N>
267
+ inline std::enable_if_t<std::is_base_of_v<BaseNode, N>, ChannelTrace*>
268
+ LogOutputFrom(const RefCountedPtr<N>& n) {
269
+ return LogOutputFrom(n.get());
270
+ }
271
+ } // namespace detail
272
+
203
273
  class ZTrace {
204
274
  public:
205
275
  virtual ~ZTrace() = default;
@@ -209,15 +279,79 @@ class ZTrace {
209
279
  absl::AnyInvocable<void(Json)>) = 0;
210
280
  };
211
281
 
282
+ // This class is used to collect additional information about the channelz
283
+ // node. It's the backing implementation for DataSink. channelz users should
284
+ // use DataSink instead of this class directly.
285
+ // We form a shared_ptr<> around this class during collection.
286
+ // In DataSink we use a weak_ptr<> to allow rapid resource reclamation once
287
+ // the collection is complete (or has timed out).
288
+ class DataSinkImplementation {
289
+ public:
290
+ class Data {
291
+ public:
292
+ virtual ~Data() = default;
293
+ virtual Json::Object ToJson() = 0;
294
+ virtual void FillProto(google_protobuf_Any* any, upb_Arena* arena) = 0;
295
+ };
296
+
297
+ void AddData(absl::string_view name, std::unique_ptr<Data> data);
298
+ Json::Object Finalize(bool timed_out);
299
+ void Finalize(bool timed_out, grpc_channelz_v2_Entity* entity,
300
+ upb_Arena* arena);
301
+
302
+ private:
303
+ Mutex mu_;
304
+ std::map<std::string, std::unique_ptr<Data>> additional_info_
305
+ ABSL_GUARDED_BY(mu_);
306
+ };
307
+
308
+ // Wrapper around absl::AnyInvocable<void()> that is used to notify when the
309
+ // DataSink has completed.
310
+ // We hold a shared_ptr<> around this class in DataSink to keep knowledge of
311
+ // when the DataSink has completed.
312
+ class DataSinkCompletionNotification {
313
+ public:
314
+ explicit DataSinkCompletionNotification(absl::AnyInvocable<void()> callback)
315
+ : callback_(std::move(callback)) {}
316
+ ~DataSinkCompletionNotification() { callback_(); }
317
+
318
+ private:
319
+ absl::AnyInvocable<void()> callback_;
320
+ };
321
+
212
322
  class DataSink {
213
323
  public:
214
- virtual void AddAdditionalInfo(absl::string_view name,
215
- Json::Object additional_info) = 0;
216
- virtual void AddChildObjects(
217
- std::vector<RefCountedPtr<BaseNode>> children) = 0;
324
+ DataSink(std::shared_ptr<DataSinkImplementation> impl,
325
+ std::shared_ptr<DataSinkCompletionNotification> notification)
326
+ : impl_(impl), notification_(std::move(notification)) {}
327
+
328
+ template <typename T>
329
+ std::void_t<decltype(std::declval<T>().TakeJsonObject())> AddData(
330
+ absl::string_view name, T value) {
331
+ class DataImpl final : public DataSinkImplementation::Data {
332
+ public:
333
+ explicit DataImpl(T value) : value_(std::move(value)) {}
334
+ Json::Object ToJson() override { return value_.TakeJsonObject(); }
335
+ void FillProto(google_protobuf_Any* any, upb_Arena* arena) override {
336
+ value_.FillAny(any, arena);
337
+ }
338
+
339
+ private:
340
+ T value_;
341
+ };
342
+ AddData(name, std::make_unique<DataImpl>(std::move(value)));
343
+ }
218
344
 
219
- protected:
220
- ~DataSink() = default;
345
+ private:
346
+ void AddData(absl::string_view name,
347
+ std::unique_ptr<DataSinkImplementation::Data> data) {
348
+ auto impl = impl_.lock();
349
+ if (impl == nullptr) return;
350
+ impl->AddData(name, std::move(data));
351
+ }
352
+
353
+ std::weak_ptr<DataSinkImplementation> impl_;
354
+ std::shared_ptr<DataSinkCompletionNotification> notification_;
221
355
  };
222
356
 
223
357
  class DataSource {
@@ -227,7 +361,7 @@ class DataSource {
227
361
  // Add any relevant json fragments to the output.
228
362
  // This method must not cause the DataSource to be deleted, or else there will
229
363
  // be a deadlock.
230
- virtual void AddData(DataSink&) {}
364
+ virtual void AddData(DataSink) {}
231
365
 
232
366
  // If this data source exports some ztrace, return it here.
233
367
  virtual std::unique_ptr<ZTrace> GetZTrace(absl::string_view /*name*/) {
@@ -238,11 +372,15 @@ class DataSource {
238
372
  ~DataSource();
239
373
  RefCountedPtr<BaseNode> channelz_node() { return node_; }
240
374
 
375
+ // This method must be called in the most derived class's constructor.
376
+ // It adds this data source to the node's list of data sources.
377
+ void SourceConstructed();
378
+
241
379
  // This method must be called in the most derived class's destructor.
242
380
  // It removes this data source from the node's list of data sources.
243
381
  // If it is not called, then the AddData() function pointer may be invalid
244
382
  // when the node is queried.
245
- void ResetDataSource();
383
+ void SourceDestructing();
246
384
 
247
385
  private:
248
386
  RefCountedPtr<BaseNode> node_;
@@ -260,6 +398,7 @@ struct CallCounts {
260
398
  }
261
399
 
262
400
  void PopulateJson(Json::Object& json) const;
401
+ PropertyList ToPropertyList() const;
263
402
  };
264
403
 
265
404
  // This class is a helper class for channelz entities that deal with Channels,
@@ -319,7 +458,7 @@ class PerCpuCallCountingHelper final {
319
458
  // Handles channelz bookkeeping for channels
320
459
  class ChannelNode final : public BaseNode {
321
460
  public:
322
- ChannelNode(std::string target, size_t channel_tracer_max_nodes,
461
+ ChannelNode(std::string target, size_t max_trace_memory,
323
462
  bool is_internal_channel);
324
463
 
325
464
  void Orphaned() override {
@@ -341,15 +480,6 @@ class ChannelNode final : public BaseNode {
341
480
  Json RenderJson() override;
342
481
 
343
482
  // proxy methods to composed classes.
344
- void AddTraceEvent(ChannelTrace::Severity severity, const grpc_slice& data) {
345
- trace_.AddTraceEvent(severity, data);
346
- }
347
- void AddTraceEventWithReference(ChannelTrace::Severity severity,
348
- const grpc_slice& data,
349
- RefCountedPtr<BaseNode> referenced_channel) {
350
- trace_.AddTraceEventWithReference(severity, data,
351
- std::move(referenced_channel));
352
- }
353
483
  void SetChannelArgs(const ChannelArgs& channel_args) {
354
484
  channel_args_ = channel_args;
355
485
  }
@@ -364,15 +494,14 @@ class ChannelNode final : public BaseNode {
364
494
  CallCounts GetCallCounts() const { return call_counter_.GetCallCounts(); }
365
495
  std::set<intptr_t> child_channels() const;
366
496
  std::set<intptr_t> child_subchannels() const;
367
- const ChannelTrace& trace() const { return trace_; }
368
497
  const ChannelArgs& channel_args() const { return channel_args_; }
369
498
 
370
499
  private:
371
500
  void PopulateChildRefs(Json::Object* json);
501
+ void AddNodeSpecificData(DataSink sink) override;
372
502
 
373
503
  std::string target_;
374
504
  CallCountingHelper call_counter_;
375
- ChannelTrace trace_;
376
505
  // TODO(ctiller): keeping channel args here can create odd circular references
377
506
  // that are hard to reason about. Consider moving this to a DataSource.
378
507
  ChannelArgs channel_args_;
@@ -385,7 +514,7 @@ class ChannelNode final : public BaseNode {
385
514
  // Handles channelz bookkeeping for subchannels
386
515
  class SubchannelNode final : public BaseNode {
387
516
  public:
388
- SubchannelNode(std::string target_address, size_t channel_tracer_max_nodes);
517
+ SubchannelNode(std::string target_address, size_t max_trace_memory);
389
518
  ~SubchannelNode() override;
390
519
 
391
520
  void Orphaned() override {
@@ -404,18 +533,9 @@ class SubchannelNode final : public BaseNode {
404
533
  Json RenderJson() override;
405
534
 
406
535
  // proxy methods to composed classes.
407
- void AddTraceEvent(ChannelTrace::Severity severity, const grpc_slice& data) {
408
- trace_.AddTraceEvent(severity, data);
409
- }
410
536
  void SetChannelArgs(const ChannelArgs& channel_args) {
411
537
  channel_args_ = channel_args;
412
538
  }
413
- void AddTraceEventWithReference(ChannelTrace::Severity severity,
414
- const grpc_slice& data,
415
- RefCountedPtr<BaseNode> referenced_channel) {
416
- trace_.AddTraceEventWithReference(severity, data,
417
- std::move(referenced_channel));
418
- }
419
539
  void RecordCallStarted() { call_counter_.RecordCallStarted(); }
420
540
  void RecordCallFailed() { call_counter_.RecordCallFailed(); }
421
541
  void RecordCallSucceeded() { call_counter_.RecordCallSucceeded(); }
@@ -423,23 +543,23 @@ class SubchannelNode final : public BaseNode {
423
543
  const std::string& target() const { return target_; }
424
544
  std::string connectivity_state() const;
425
545
  CallCounts GetCallCounts() const { return call_counter_.GetCallCounts(); }
426
- RefCountedPtr<SocketNode> child_socket() const {
546
+ WeakRefCountedPtr<SocketNode> child_socket() const {
427
547
  MutexLock lock(&socket_mu_);
428
548
  return child_socket_;
429
549
  }
430
- const ChannelTrace& trace() const { return trace_; }
431
550
  const ChannelArgs& channel_args() const { return channel_args_; }
432
551
 
433
552
  private:
553
+ void AddNodeSpecificData(DataSink sink) override;
554
+
434
555
  // Allows the channel trace test to access trace_.
435
556
  friend class testing::SubchannelNodePeer;
436
557
 
437
558
  std::atomic<grpc_connectivity_state> connectivity_state_{GRPC_CHANNEL_IDLE};
438
559
  mutable Mutex socket_mu_;
439
- RefCountedPtr<SocketNode> child_socket_ ABSL_GUARDED_BY(socket_mu_);
560
+ WeakRefCountedPtr<SocketNode> child_socket_ ABSL_GUARDED_BY(socket_mu_);
440
561
  std::string target_;
441
562
  CallCountingHelper call_counter_;
442
- ChannelTrace trace_;
443
563
  // TODO(ctiller): keeping channel args here can create odd circular references
444
564
  // that are hard to reason about. Consider moving this to a DataSource.
445
565
  ChannelArgs channel_args_;
@@ -448,7 +568,7 @@ class SubchannelNode final : public BaseNode {
448
568
  // Handles channelz bookkeeping for servers
449
569
  class ServerNode final : public BaseNode {
450
570
  public:
451
- explicit ServerNode(size_t channel_tracer_max_nodes);
571
+ explicit ServerNode(size_t max_trace_memory);
452
572
 
453
573
  ~ServerNode() override;
454
574
 
@@ -463,15 +583,6 @@ class ServerNode final : public BaseNode {
463
583
  intptr_t max_results);
464
584
 
465
585
  // proxy methods to composed classes.
466
- void AddTraceEvent(ChannelTrace::Severity severity, const grpc_slice& data) {
467
- trace_.AddTraceEvent(severity, data);
468
- }
469
- void AddTraceEventWithReference(ChannelTrace::Severity severity,
470
- const grpc_slice& data,
471
- RefCountedPtr<BaseNode> referenced_channel) {
472
- trace_.AddTraceEventWithReference(severity, data,
473
- std::move(referenced_channel));
474
- }
475
586
  void SetChannelArgs(const ChannelArgs& channel_args) {
476
587
  channel_args_ = channel_args;
477
588
  }
@@ -481,16 +592,16 @@ class ServerNode final : public BaseNode {
481
592
 
482
593
  CallCounts GetCallCounts() const { return call_counter_.GetCallCounts(); }
483
594
 
484
- std::map<intptr_t, RefCountedPtr<ListenSocketNode>> child_listen_sockets()
595
+ std::map<intptr_t, WeakRefCountedPtr<ListenSocketNode>> child_listen_sockets()
485
596
  const;
486
- std::map<intptr_t, RefCountedPtr<SocketNode>> child_sockets() const;
597
+ std::map<intptr_t, WeakRefCountedPtr<SocketNode>> child_sockets() const;
487
598
 
488
- const ChannelTrace& trace() const { return trace_; }
489
599
  const ChannelArgs& channel_args() const { return channel_args_; }
490
600
 
491
601
  private:
602
+ void AddNodeSpecificData(DataSink sink) override;
603
+
492
604
  PerCpuCallCountingHelper call_counter_;
493
- ChannelTrace trace_;
494
605
  // TODO(ctiller): keeping channel args here can create odd circular references
495
606
  // that are hard to reason about. Consider moving this to a DataSource.
496
607
  ChannelArgs channel_args_;
@@ -514,6 +625,7 @@ class SocketNode final : public BaseNode {
514
625
  std::string remote_certificate;
515
626
 
516
627
  Json RenderJson();
628
+ PropertyList ToPropertyList() const;
517
629
  };
518
630
  enum class ModelType { kUnset = 0, kTls = 1, kOther = 2 };
519
631
  ModelType type = ModelType::kUnset;
@@ -521,6 +633,7 @@ class SocketNode final : public BaseNode {
521
633
  std::optional<Json> other;
522
634
 
523
635
  Json RenderJson();
636
+ PropertyList ToPropertyList() const;
524
637
 
525
638
  static absl::string_view ChannelArgName() {
526
639
  return GRPC_ARG_CHANNELZ_SECURITY;
@@ -529,11 +642,6 @@ class SocketNode final : public BaseNode {
529
642
  static int ChannelArgsCompare(const Security* a, const Security* b) {
530
643
  return QsortCompare(a, b);
531
644
  }
532
-
533
- grpc_arg MakeChannelArg() const;
534
-
535
- static RefCountedPtr<Security> GetFromChannelArgs(
536
- const grpc_channel_args* args);
537
645
  };
538
646
 
539
647
  SocketNode(std::string local, std::string remote, std::string name,
@@ -602,6 +710,7 @@ class SocketNode final : public BaseNode {
602
710
  gpr_cycle_counter cycle_counter) const {
603
711
  return gpr_format_timespec(gpr_cycle_counter_to_time(cycle_counter));
604
712
  }
713
+ void AddNodeSpecificData(DataSink sink) override;
605
714
 
606
715
  std::atomic<int64_t> streams_started_{0};
607
716
  std::atomic<int64_t> streams_succeeded_{0};
@@ -627,13 +736,17 @@ class ListenSocketNode final : public BaseNode {
627
736
  Json RenderJson() override;
628
737
 
629
738
  private:
739
+ void AddNodeSpecificData(DataSink sink) override;
740
+
630
741
  std::string local_addr_;
631
742
  };
632
743
 
633
744
  class CallNode final : public BaseNode {
634
745
  public:
635
746
  explicit CallNode(std::string name)
636
- : BaseNode(EntityType::kCall, std::move(name)) {}
747
+ : BaseNode(EntityType::kCall, 0, std::move(name)) {
748
+ NodeConstructed();
749
+ }
637
750
 
638
751
  Json RenderJson() override;
639
752
  };
@@ -288,7 +288,8 @@ WeakRefCountedPtr<BaseNode> ChannelzRegistry::InternalGet(intptr_t uuid) {
288
288
 
289
289
  intptr_t ChannelzRegistry::InternalNumberNode(BaseNode* node) {
290
290
  // node must be strongly owned still
291
- node->AssertStronglyOwned();
291
+ auto strong_node = node->RefIfNonZero();
292
+ if (strong_node == nullptr) return 0;
292
293
  const size_t node_shard_index = NodeShardIndex(node);
293
294
  NodeShard& node_shard = node_shards_[node_shard_index];
294
295
  MutexLock index_lock(&index_mu_);
@@ -89,6 +89,12 @@ class ChannelzRegistry final {
89
89
  start_channel_id);
90
90
  }
91
91
 
92
+ static auto GetTopSockets(intptr_t start_socket_id) {
93
+ return Default()
94
+ ->InternalGetObjects<SocketNode, BaseNode::EntityType::kSocket>(
95
+ start_socket_id);
96
+ }
97
+
92
98
  static std::string GetTopChannelsJson(intptr_t start_channel_id);
93
99
  static std::string GetServersJson(intptr_t start_server_id);
94
100
 
@@ -107,6 +113,16 @@ class ChannelzRegistry final {
107
113
  max_results);
108
114
  }
109
115
 
116
+ static WeakRefCountedPtr<BaseNode> GetNode(intptr_t uuid) {
117
+ return Default()->InternalGet(uuid);
118
+ }
119
+
120
+ static std::tuple<std::vector<WeakRefCountedPtr<BaseNode>>, bool>
121
+ GetNodesOfType(intptr_t start_node, BaseNode::EntityType type,
122
+ size_t max_results) {
123
+ return Default()->InternalGetNodesOfType(start_node, type, max_results);
124
+ }
125
+
110
126
  // Test only helper function to dump the JSON representation to std out.
111
127
  // This can aid in debugging channelz code.
112
128
  static void LogAllEntities() { Default()->InternalLogAllEntities(); }
@@ -210,6 +226,14 @@ class ChannelzRegistry final {
210
226
  max_results);
211
227
  }
212
228
 
229
+ std::tuple<std::vector<WeakRefCountedPtr<BaseNode>>, bool>
230
+ InternalGetNodesOfType(intptr_t start_node, BaseNode::EntityType type,
231
+ size_t max_results) {
232
+ return QueryNodes(
233
+ start_node, [type](const BaseNode* n) { return n->type() == type; },
234
+ max_results);
235
+ }
236
+
213
237
  template <typename T, BaseNode::EntityType entity_type>
214
238
  WeakRefCountedPtr<T> InternalGetTyped(intptr_t uuid) {
215
239
  WeakRefCountedPtr<BaseNode> node = InternalGet(uuid);