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
@@ -30,22 +30,28 @@
30
30
  #include <string>
31
31
  #include <tuple>
32
32
 
33
+ #include "absl/cleanup/cleanup.h"
33
34
  #include "absl/log/check.h"
34
35
  #include "absl/status/statusor.h"
35
36
  #include "absl/strings/escaping.h"
36
37
  #include "absl/strings/str_cat.h"
37
38
  #include "absl/strings/strip.h"
38
39
  #include "src/core/channelz/channelz_registry.h"
40
+ #include "src/core/channelz/property_list.h"
39
41
  #include "src/core/lib/address_utils/parse_address.h"
40
42
  #include "src/core/lib/address_utils/sockaddr_utils.h"
41
43
  #include "src/core/lib/channel/channel_args.h"
42
44
  #include "src/core/lib/iomgr/resolved_address.h"
43
45
  #include "src/core/lib/transport/connectivity_state.h"
44
46
  #include "src/core/util/json/json_writer.h"
47
+ #include "src/core/util/notification.h"
45
48
  #include "src/core/util/string.h"
46
49
  #include "src/core/util/time.h"
50
+ #include "src/core/util/time_precise.h"
51
+ #include "src/core/util/upb_utils.h"
47
52
  #include "src/core/util/uri.h"
48
53
  #include "src/core/util/useful.h"
54
+ #include "src/proto/grpc/channelz/v2/channelz.upb.h"
49
55
 
50
56
  namespace grpc_core {
51
57
  namespace channelz {
@@ -54,123 +60,54 @@ namespace channelz {
54
60
  // DataSink
55
61
  //
56
62
 
57
- namespace {
58
- class ChildObjectCollector {
59
- public:
60
- void Add(RefCountedPtr<BaseNode> node) {
61
- child_objects_[node->type()].insert(node->uuid());
62
- }
63
-
64
- void Add(std::vector<RefCountedPtr<BaseNode>> nodes) {
65
- for (auto& node : nodes) Add(std::move(node));
66
- }
67
-
68
- // Calls AddAdditionalInfo to export the collected child objects.
69
- void Finalize(DataSink& sink) {
70
- if (child_objects_.empty()) return;
71
- Json::Object subobjects;
72
- for (const auto& [type, child_objects] : child_objects_) {
73
- std::string key;
74
- switch (type) {
75
- case BaseNode::EntityType::kTopLevelChannel:
76
- case BaseNode::EntityType::kSubchannel:
77
- case BaseNode::EntityType::kListenSocket:
78
- case BaseNode::EntityType::kServer:
79
- case BaseNode::EntityType::kInternalChannel: {
80
- LOG(ERROR)
81
- << "Nodes of type " << BaseNode::EntityTypeString(type)
82
- << " not supported for child object collection in DataSink";
83
- continue;
84
- }
85
- case BaseNode::EntityType::kSocket:
86
- key = "subSockets";
87
- break;
88
- case BaseNode::EntityType::kCall:
89
- key = "calls";
90
- break;
91
- }
92
- Json::Array uuids;
93
- uuids.reserve(child_objects.size());
94
- for (int64_t uuid : child_objects) {
95
- uuids.push_back(Json::FromNumber(uuid));
96
- }
97
- subobjects[key] = Json::FromArray(std::move(uuids));
98
- }
99
- sink.AddAdditionalInfo("childObjects", std::move(subobjects));
100
- }
101
-
102
- private:
103
- std::map<BaseNode::EntityType, std::set<int64_t>> child_objects_;
104
- };
105
-
106
- class JsonDataSink final : public DataSink {
107
- public:
108
- explicit JsonDataSink(Json::Object& output) : output_(output) {
109
- CHECK(output_.find("additionalInfo") == output_.end());
110
- }
111
- ~JsonDataSink() {
112
- collector_.Finalize(*this);
113
- if (additional_info_ != nullptr) {
114
- output_["additionalInfo"] =
115
- Json::FromObject(std::move(*additional_info_));
116
- }
117
- }
118
-
119
- void AddAdditionalInfo(absl::string_view name,
120
- Json::Object additional_info) override {
121
- if (additional_info_ == nullptr) {
122
- additional_info_ = std::make_unique<Json::Object>();
123
- }
124
- additional_info_->emplace(name,
125
- Json::FromObject(std::move(additional_info)));
126
- }
127
-
128
- void AddChildObjects(
129
- std::vector<RefCountedPtr<BaseNode>> child_objects) override {
130
- collector_.Add(std::move(child_objects));
131
- }
132
-
133
- private:
134
- Json::Object& output_;
135
- std::unique_ptr<Json::Object> additional_info_;
136
- ChildObjectCollector collector_;
137
- };
138
-
139
- class ExplicitJsonDataSink final : public DataSink {
140
- public:
141
- void AddAdditionalInfo(absl::string_view name,
142
- Json::Object additional_info) override {
143
- additional_info_.emplace(name,
144
- Json::FromObject(std::move(additional_info)));
145
- }
63
+ void DataSinkImplementation::AddData(absl::string_view name,
64
+ std::unique_ptr<Data> data) {
65
+ MutexLock lock(&mu_);
66
+ additional_info_.emplace(name, std::move(data));
67
+ }
146
68
 
147
- void AddChildObjects(
148
- std::vector<RefCountedPtr<BaseNode>> child_objects) override {
149
- collector_.Add(std::move(child_objects));
69
+ Json::Object DataSinkImplementation::Finalize(bool) {
70
+ MutexLock lock(&mu_);
71
+ Json::Object out;
72
+ for (auto& [name, additional_info] : additional_info_) {
73
+ out[name] = Json::FromObject(additional_info->ToJson());
150
74
  }
75
+ return out;
76
+ }
151
77
 
152
- Json::Object Finalize() {
153
- collector_.Finalize(*this);
154
- return std::move(additional_info_);
78
+ void DataSinkImplementation::Finalize(bool timed_out,
79
+ grpc_channelz_v2_Entity* entity,
80
+ upb_Arena* arena) {
81
+ MutexLock lock(&mu_);
82
+ grpc_channelz_v2_Entity_set_timed_out(entity, timed_out);
83
+ for (auto& [name, additional_info] : additional_info_) {
84
+ auto* staple = grpc_channelz_v2_Entity_add_data(entity, arena);
85
+ grpc_channelz_v2_Data_set_name(staple,
86
+ CopyStdStringToUpbString(name, arena));
87
+ additional_info->FillProto(
88
+ grpc_channelz_v2_Data_mutable_value(staple, arena), arena);
155
89
  }
156
-
157
- private:
158
- Json::Object additional_info_;
159
- ChildObjectCollector collector_;
160
- };
161
- } // namespace
90
+ }
162
91
 
163
92
  //
164
93
  // BaseNode
165
94
  //
166
95
 
167
- BaseNode::BaseNode(EntityType type, std::string name)
168
- : type_(type), uuid_(-1), name_(std::move(name)) {
169
- // The registry will set uuid_ under its lock.
96
+ BaseNode::BaseNode(EntityType type, size_t max_trace_memory, std::string name)
97
+ : type_(type),
98
+ uuid_(-1),
99
+ name_(std::move(name)),
100
+ trace_(max_trace_memory) {}
101
+
102
+ void BaseNode::NodeConstructed() {
103
+ node_constructed_called_ = true;
170
104
  ChannelzRegistry::Register(this);
171
105
  }
172
106
 
173
- void BaseNode::Orphaned() { ChannelzRegistry::Unregister(this); }
107
+ void BaseNode::Orphaned() {
108
+ DCHECK(node_constructed_called_);
109
+ ChannelzRegistry::Unregister(this);
110
+ }
174
111
 
175
112
  intptr_t BaseNode::UuidSlow() { return ChannelzRegistry::NumberNode(this); }
176
113
 
@@ -180,20 +117,25 @@ std::string BaseNode::RenderJsonString() {
180
117
  }
181
118
 
182
119
  void BaseNode::PopulateJsonFromDataSources(Json::Object& json) {
183
- JsonDataSink sink(json);
184
- MutexLock lock(&data_sources_mu_);
185
- for (DataSource* data_source : data_sources_) {
186
- data_source->AddData(sink);
187
- }
120
+ auto info = AdditionalInfo();
121
+ if (info.empty()) return;
122
+ json["additionalInfo"] = Json::FromObject(std::move(info));
188
123
  }
189
124
 
190
125
  Json::Object BaseNode::AdditionalInfo() {
191
- ExplicitJsonDataSink sink;
192
- MutexLock lock(&data_sources_mu_);
193
- for (DataSource* data_source : data_sources_) {
194
- data_source->AddData(sink);
126
+ auto done = std::make_shared<Notification>();
127
+ auto sink_impl = std::make_shared<DataSinkImplementation>();
128
+ {
129
+ MutexLock lock(&data_sources_mu_);
130
+ auto done_notifier = std::make_shared<DataSinkCompletionNotification>(
131
+ [done]() { done->Notify(); });
132
+ for (DataSource* data_source : data_sources_) {
133
+ data_source->AddData(DataSink(sink_impl, done_notifier));
134
+ }
195
135
  }
196
- return sink.Finalize();
136
+ bool completed =
137
+ done->WaitForNotificationWithTimeout(absl::Milliseconds(100));
138
+ return sink_impl->Finalize(!completed);
197
139
  }
198
140
 
199
141
  void BaseNode::RunZTrace(
@@ -235,28 +177,86 @@ void BaseNode::RunZTrace(
235
177
  ztrace->Run(deadline, std::move(args), event_engine, std::move(callback));
236
178
  }
237
179
 
180
+ void BaseNode::SerializeEntity(grpc_channelz_v2_Entity* entity,
181
+ upb_Arena* arena) {
182
+ grpc_channelz_v2_Entity_set_id(entity, uuid());
183
+ grpc_channelz_v2_Entity_set_kind(
184
+ entity, StdStringToUpbString(EntityTypeToKind(type_)));
185
+ {
186
+ MutexLock lock(&parent_mu_);
187
+ auto* parents =
188
+ grpc_channelz_v2_Entity_resize_parents(entity, parents_.size(), arena);
189
+ for (const auto& parent : parents_) {
190
+ *parents++ = parent->uuid();
191
+ }
192
+ }
193
+ grpc_channelz_v2_Entity_set_orphaned(entity, orphaned_index_ != 0);
194
+
195
+ auto done = std::make_shared<Notification>();
196
+ auto sink_impl = std::make_shared<DataSinkImplementation>();
197
+ auto done_notifier = std::make_shared<DataSinkCompletionNotification>(
198
+ [done]() { done->Notify(); });
199
+ auto make_data_sink = [sink_impl, done_notifier]() {
200
+ return DataSink(sink_impl, done_notifier);
201
+ };
202
+ AddNodeSpecificData(make_data_sink());
203
+ {
204
+ MutexLock lock(&data_sources_mu_);
205
+ for (DataSource* data_source : data_sources_) {
206
+ data_source->AddData(make_data_sink());
207
+ }
208
+ }
209
+ bool completed =
210
+ done->WaitForNotificationWithTimeout(absl::Milliseconds(100));
211
+ sink_impl->Finalize(!completed, entity, arena);
212
+
213
+ trace_.Render(entity, arena);
214
+ }
215
+
216
+ void BaseNode::AddNodeSpecificData(DataSink) {
217
+ // Default implementation does nothing.
218
+ }
219
+
220
+ std::string BaseNode::SerializeEntityToString() {
221
+ upb_Arena* arena = upb_Arena_New();
222
+ auto cleanup = absl::MakeCleanup([arena]() { upb_Arena_Free(arena); });
223
+ grpc_channelz_v2_Entity* entity = grpc_channelz_v2_Entity_new(arena);
224
+ SerializeEntity(entity, arena);
225
+ size_t length;
226
+ auto* bytes = grpc_channelz_v2_Entity_serialize(entity, arena, &length);
227
+ return std::string(bytes, length);
228
+ }
229
+
238
230
  //
239
231
  // DataSource
240
232
  //
241
233
 
242
- DataSource::DataSource(RefCountedPtr<BaseNode> node) : node_(std::move(node)) {
243
- if (node_ == nullptr) return;
244
- MutexLock lock(&node_->data_sources_mu_);
245
- node_->data_sources_.push_back(this);
246
- }
234
+ DataSource::DataSource(RefCountedPtr<BaseNode> node) : node_(std::move(node)) {}
247
235
 
248
236
  DataSource::~DataSource() {
249
237
  DCHECK(node_ == nullptr) << "DataSource must be ResetDataSource()'d in the "
250
238
  "most derived class before destruction";
251
239
  }
252
240
 
253
- void DataSource::ResetDataSource() {
241
+ void DataSource::SourceConstructed() {
242
+ if (node_ == nullptr) return;
243
+ MutexLock lock(&node_->data_sources_mu_);
244
+ node_->data_sources_.push_back(this);
245
+ }
246
+
247
+ void DataSource::SourceDestructing() {
254
248
  RefCountedPtr<BaseNode> node = std::move(node_);
255
249
  if (node == nullptr) return;
256
250
  MutexLock lock(&node->data_sources_mu_);
257
- node->data_sources_.erase(
258
- std::remove(node->data_sources_.begin(), node->data_sources_.end(), this),
259
- node->data_sources_.end());
251
+ for (size_t i = 0; i < node->data_sources_.size(); ++i) {
252
+ if (node->data_sources_[i] == this) {
253
+ std::swap(node->data_sources_[i], node->data_sources_.back());
254
+ node->data_sources_.pop_back();
255
+ return;
256
+ }
257
+ }
258
+ LOG(DFATAL) << "DataSource not found in node's data sources -- probably "
259
+ "SourceConstructed was not called";
260
260
  }
261
261
 
262
262
  //
@@ -295,6 +295,17 @@ void CallCounts::PopulateJson(Json::Object& json) const {
295
295
  }
296
296
  }
297
297
 
298
+ PropertyList CallCounts::ToPropertyList() const {
299
+ return PropertyList()
300
+ .Set("calls_started", calls_started)
301
+ .Set("calls_succeeded", calls_succeeded)
302
+ .Set("calls_failed", calls_failed)
303
+ .Set("last_call_started_timestamp", [this]() -> std::optional<Timestamp> {
304
+ if (last_call_started_cycle == 0) return std::nullopt;
305
+ return Timestamp::FromCycleCounterRoundDown(last_call_started_cycle);
306
+ }());
307
+ }
308
+
298
309
  //
299
310
  // PerCpuCallCountingHelper
300
311
  //
@@ -335,13 +346,14 @@ CallCounts PerCpuCallCountingHelper::GetCallCounts() const {
335
346
  // ChannelNode
336
347
  //
337
348
 
338
- ChannelNode::ChannelNode(std::string target, size_t channel_tracer_max_nodes,
349
+ ChannelNode::ChannelNode(std::string target, size_t max_trace_memory,
339
350
  bool is_internal_channel)
340
351
  : BaseNode(is_internal_channel ? EntityType::kInternalChannel
341
352
  : EntityType::kTopLevelChannel,
342
- target),
343
- target_(std::move(target)),
344
- trace_(channel_tracer_max_nodes) {}
353
+ max_trace_memory, target),
354
+ target_(std::move(target)) {
355
+ NodeConstructed();
356
+ }
345
357
 
346
358
  const char* ChannelNode::GetChannelConnectivityStateChangeString(
347
359
  grpc_connectivity_state state) {
@@ -405,7 +417,7 @@ Json ChannelNode::RenderJson() {
405
417
  });
406
418
  }
407
419
  // Fill in the channel trace if applicable.
408
- Json trace_json = trace_.RenderJson();
420
+ Json trace_json = trace().RenderJson();
409
421
  if (trace_json.type() != Json::Type::kNull) {
410
422
  data["trace"] = std::move(trace_json);
411
423
  }
@@ -425,6 +437,14 @@ Json ChannelNode::RenderJson() {
425
437
  return Json::FromObject(std::move(json));
426
438
  }
427
439
 
440
+ void ChannelNode::AddNodeSpecificData(DataSink sink) {
441
+ sink.AddData("channel", PropertyList()
442
+ .Set("target", target_)
443
+ .Set("connectivity_state", connectivity_state()));
444
+ sink.AddData("call_counts", call_counter_.GetCallCounts().ToPropertyList());
445
+ sink.AddData("channel_args", channel_args_.ToPropertyList());
446
+ }
447
+
428
448
  void ChannelNode::PopulateChildRefs(Json::Object* json) {
429
449
  auto child_subchannels = this->child_subchannels();
430
450
  auto child_channels = this->child_channels();
@@ -459,10 +479,11 @@ void ChannelNode::SetConnectivityState(grpc_connectivity_state state) {
459
479
  //
460
480
 
461
481
  SubchannelNode::SubchannelNode(std::string target_address,
462
- size_t channel_tracer_max_nodes)
463
- : BaseNode(EntityType::kSubchannel, target_address),
464
- target_(std::move(target_address)),
465
- trace_(channel_tracer_max_nodes) {}
482
+ size_t max_trace_memory)
483
+ : BaseNode(EntityType::kSubchannel, max_trace_memory, target_address),
484
+ target_(std::move(target_address)) {
485
+ NodeConstructed();
486
+ }
466
487
 
467
488
  SubchannelNode::~SubchannelNode() {}
468
489
 
@@ -472,7 +493,8 @@ void SubchannelNode::UpdateConnectivityState(grpc_connectivity_state state) {
472
493
 
473
494
  void SubchannelNode::SetChildSocket(RefCountedPtr<SocketNode> socket) {
474
495
  MutexLock lock(&socket_mu_);
475
- child_socket_ = std::move(socket);
496
+ child_socket_ =
497
+ socket == nullptr ? nullptr : socket->WeakRefAsSubclass<SocketNode>();
476
498
  }
477
499
 
478
500
  std::string SubchannelNode::connectivity_state() const {
@@ -490,7 +512,7 @@ Json SubchannelNode::RenderJson() {
490
512
  {"target", Json::FromString(target_)},
491
513
  };
492
514
  // Fill in the channel trace if applicable
493
- Json trace_json = trace_.RenderJson();
515
+ Json trace_json = trace().RenderJson();
494
516
  if (trace_json.type() != Json::Type::kNull) {
495
517
  data["trace"] = std::move(trace_json);
496
518
  }
@@ -504,7 +526,7 @@ Json SubchannelNode::RenderJson() {
504
526
  {"data", Json::FromObject(std::move(data))},
505
527
  };
506
528
  // Populate the child socket.
507
- RefCountedPtr<SocketNode> child_socket;
529
+ WeakRefCountedPtr<SocketNode> child_socket;
508
530
  {
509
531
  MutexLock lock(&socket_mu_);
510
532
  child_socket = child_socket_;
@@ -521,12 +543,22 @@ Json SubchannelNode::RenderJson() {
521
543
  return Json::FromObject(std::move(object));
522
544
  }
523
545
 
546
+ void SubchannelNode::AddNodeSpecificData(DataSink sink) {
547
+ sink.AddData("channel", PropertyList()
548
+ .Set("target", target_)
549
+ .Set("connectivity_state", connectivity_state()));
550
+ sink.AddData("call_counts", call_counter_.GetCallCounts().ToPropertyList());
551
+ sink.AddData("channel_args", channel_args_.ToPropertyList());
552
+ }
553
+
524
554
  //
525
555
  // ServerNode
526
556
  //
527
557
 
528
- ServerNode::ServerNode(size_t channel_tracer_max_nodes)
529
- : BaseNode(EntityType::kServer, ""), trace_(channel_tracer_max_nodes) {}
558
+ ServerNode::ServerNode(size_t max_trace_memory)
559
+ : BaseNode(EntityType::kServer, max_trace_memory, "") {
560
+ NodeConstructed();
561
+ }
530
562
 
531
563
  ServerNode::~ServerNode() {}
532
564
 
@@ -555,7 +587,7 @@ std::string ServerNode::RenderServerSockets(intptr_t start_socket_id,
555
587
  Json ServerNode::RenderJson() {
556
588
  Json::Object data;
557
589
  // Fill in the channel trace if applicable.
558
- Json trace_json = trace_.RenderJson();
590
+ Json trace_json = trace().RenderJson();
559
591
  if (trace_json.type() != Json::Type::kNull) {
560
592
  data["trace"] = std::move(trace_json);
561
593
  }
@@ -586,26 +618,31 @@ Json ServerNode::RenderJson() {
586
618
  return Json::FromObject(std::move(object));
587
619
  }
588
620
 
589
- std::map<intptr_t, RefCountedPtr<ListenSocketNode>>
621
+ void ServerNode::AddNodeSpecificData(DataSink sink) {
622
+ sink.AddData("call_counts", call_counter_.GetCallCounts().ToPropertyList());
623
+ sink.AddData("channel_args", channel_args_.ToPropertyList());
624
+ }
625
+
626
+ std::map<intptr_t, WeakRefCountedPtr<ListenSocketNode>>
590
627
  ServerNode::child_listen_sockets() const {
591
- std::map<intptr_t, RefCountedPtr<ListenSocketNode>> result;
628
+ std::map<intptr_t, WeakRefCountedPtr<ListenSocketNode>> result;
592
629
  auto [children, _] = ChannelzRegistry::GetChildrenOfType(
593
630
  0, this, BaseNode::EntityType::kListenSocket,
594
631
  std::numeric_limits<size_t>::max());
595
632
  for (const auto& child : children) {
596
- result[child->uuid()] = child->RefAsSubclass<ListenSocketNode>();
633
+ result[child->uuid()] = child->WeakRefAsSubclass<ListenSocketNode>();
597
634
  }
598
635
  return result;
599
636
  }
600
637
 
601
- std::map<intptr_t, RefCountedPtr<SocketNode>> ServerNode::child_sockets()
638
+ std::map<intptr_t, WeakRefCountedPtr<SocketNode>> ServerNode::child_sockets()
602
639
  const {
603
- std::map<intptr_t, RefCountedPtr<SocketNode>> result;
640
+ std::map<intptr_t, WeakRefCountedPtr<SocketNode>> result;
604
641
  auto [children, _] = ChannelzRegistry::GetChildrenOfType(
605
642
  0, this, BaseNode::EntityType::kSocket,
606
643
  std::numeric_limits<size_t>::max());
607
644
  for (const auto& child : children) {
608
- result[child->uuid()] = child->RefAsSubclass<SocketNode>();
645
+ result[child->uuid()] = child->WeakRefAsSubclass<SocketNode>();
609
646
  }
610
647
  return result;
611
648
  }
@@ -632,6 +669,27 @@ Json SocketNode::Security::Tls::RenderJson() {
632
669
  return Json::FromObject(std::move(data));
633
670
  }
634
671
 
672
+ PropertyList SocketNode::Security::Tls::ToPropertyList() const {
673
+ PropertyList result;
674
+ switch (type) {
675
+ case NameType::kUnset:
676
+ break;
677
+ case NameType::kStandardName:
678
+ result.Set("standard_name", name);
679
+ break;
680
+ case NameType::kOtherName:
681
+ result.Set("other_name", name);
682
+ break;
683
+ }
684
+ if (!local_certificate.empty()) {
685
+ result.Set("local_certificate", absl::Base64Escape(local_certificate));
686
+ }
687
+ if (!remote_certificate.empty()) {
688
+ result.Set("remote_certificate", absl::Base64Escape(remote_certificate));
689
+ }
690
+ return result;
691
+ }
692
+
635
693
  //
636
694
  // SocketNode::Security
637
695
  //
@@ -655,38 +713,22 @@ Json SocketNode::Security::RenderJson() {
655
713
  return Json::FromObject(std::move(data));
656
714
  }
657
715
 
658
- namespace {
659
-
660
- void* SecurityArgCopy(void* p) {
661
- SocketNode::Security* xds_certificate_provider =
662
- static_cast<SocketNode::Security*>(p);
663
- return xds_certificate_provider->Ref().release();
664
- }
665
-
666
- void SecurityArgDestroy(void* p) {
667
- SocketNode::Security* xds_certificate_provider =
668
- static_cast<SocketNode::Security*>(p);
669
- xds_certificate_provider->Unref();
670
- }
671
-
672
- int SecurityArgCmp(void* p, void* q) { return QsortCompare(p, q); }
673
-
674
- const grpc_arg_pointer_vtable kChannelArgVtable = {
675
- SecurityArgCopy, SecurityArgDestroy, SecurityArgCmp};
676
-
677
- } // namespace
678
-
679
- grpc_arg SocketNode::Security::MakeChannelArg() const {
680
- return grpc_channel_arg_pointer_create(
681
- const_cast<char*>(GRPC_ARG_CHANNELZ_SECURITY),
682
- const_cast<SocketNode::Security*>(this), &kChannelArgVtable);
683
- }
684
-
685
- RefCountedPtr<SocketNode::Security> SocketNode::Security::GetFromChannelArgs(
686
- const grpc_channel_args* args) {
687
- Security* security = grpc_channel_args_find_pointer<Security>(
688
- args, GRPC_ARG_CHANNELZ_SECURITY);
689
- return security != nullptr ? security->Ref() : nullptr;
716
+ PropertyList SocketNode::Security::ToPropertyList() const {
717
+ switch (type) {
718
+ case ModelType::kUnset:
719
+ break;
720
+ case ModelType::kTls:
721
+ if (tls) {
722
+ return tls->ToPropertyList();
723
+ }
724
+ break;
725
+ case ModelType::kOther:
726
+ if (other.has_value()) {
727
+ return PropertyList().Set("other", JsonDump(*other));
728
+ }
729
+ break;
730
+ }
731
+ return PropertyList();
690
732
  }
691
733
 
692
734
  //
@@ -736,10 +778,12 @@ void PopulateSocketAddressJson(Json::Object* json, const char* name,
736
778
 
737
779
  SocketNode::SocketNode(std::string local, std::string remote, std::string name,
738
780
  RefCountedPtr<Security> security)
739
- : BaseNode(EntityType::kSocket, std::move(name)),
781
+ : BaseNode(EntityType::kSocket, 0, std::move(name)),
740
782
  local_(std::move(local)),
741
783
  remote_(std::move(remote)),
742
- security_(std::move(security)) {}
784
+ security_(std::move(security)) {
785
+ NodeConstructed();
786
+ }
743
787
 
744
788
  void SocketNode::RecordStreamStartedFromLocal() {
745
789
  streams_started_.fetch_add(1, std::memory_order_relaxed);
@@ -845,13 +889,54 @@ Json SocketNode::RenderJson() {
845
889
  return Json::FromObject(std::move(object));
846
890
  }
847
891
 
892
+ void SocketNode::AddNodeSpecificData(DataSink sink) {
893
+ auto convert_cycle_counter =
894
+ [](gpr_cycle_counter cycle_counter) -> std::optional<Timestamp> {
895
+ if (cycle_counter == 0) return std::nullopt;
896
+ return Timestamp::FromCycleCounterRoundDown(cycle_counter);
897
+ };
898
+ sink.AddData("socket",
899
+ PropertyList().Set("local", local_).Set("remote", remote_));
900
+ sink.AddData(
901
+ "call_counts",
902
+ PropertyList()
903
+ .Set("streams_started",
904
+ streams_started_.load(std::memory_order_relaxed))
905
+ .Set("streams_succeeded",
906
+ streams_succeeded_.load(std::memory_order_relaxed))
907
+ .Set("streams_failed",
908
+ streams_failed_.load(std::memory_order_relaxed))
909
+ .Set("messages_sent", messages_sent_.load(std::memory_order_relaxed))
910
+ .Set("messages_received",
911
+ messages_received_.load(std::memory_order_relaxed))
912
+ .Set("keepalives_sent",
913
+ keepalives_sent_.load(std::memory_order_relaxed))
914
+ .Set("last_local_stream_created_timestamp",
915
+ convert_cycle_counter(last_local_stream_created_cycle_.load(
916
+ std::memory_order_relaxed)))
917
+ .Set("last_remote_stream_created_timestamp",
918
+ convert_cycle_counter(last_remote_stream_created_cycle_.load(
919
+ std::memory_order_relaxed)))
920
+ .Set("last_message_sent_timestamp",
921
+ convert_cycle_counter(
922
+ last_message_sent_cycle_.load(std::memory_order_relaxed)))
923
+ .Set("last_message_received_timestamp",
924
+ convert_cycle_counter(last_message_received_cycle_.load(
925
+ std::memory_order_relaxed))));
926
+ if (security_ != nullptr) {
927
+ sink.AddData("security", security_->ToPropertyList());
928
+ }
929
+ }
930
+
848
931
  //
849
932
  // ListenSocketNode
850
933
  //
851
934
 
852
935
  ListenSocketNode::ListenSocketNode(std::string local_addr, std::string name)
853
- : BaseNode(EntityType::kListenSocket, std::move(name)),
854
- local_addr_(std::move(local_addr)) {}
936
+ : BaseNode(EntityType::kListenSocket, 0, std::move(name)),
937
+ local_addr_(std::move(local_addr)) {
938
+ NodeConstructed();
939
+ }
855
940
 
856
941
  Json ListenSocketNode::RenderJson() {
857
942
  Json::Object object = {
@@ -865,6 +950,10 @@ Json ListenSocketNode::RenderJson() {
865
950
  return Json::FromObject(std::move(object));
866
951
  }
867
952
 
953
+ void ListenSocketNode::AddNodeSpecificData(DataSink sink) {
954
+ sink.AddData("listen_socket", PropertyList().Set("local", local_addr_));
955
+ }
956
+
868
957
  //
869
958
  // CallNode
870
959
  //