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
@@ -26,10 +26,21 @@
26
26
  #include <stdint.h>
27
27
  #include <sys/types.h>
28
28
 
29
+ #include <algorithm>
30
+ #include <memory>
31
+ #include <tuple>
32
+ #include <type_traits>
33
+
29
34
  #include "absl/base/thread_annotations.h"
35
+ #include "absl/strings/str_cat.h"
36
+ #include "absl/strings/string_view.h"
37
+ #include "src/core/lib/debug/trace_flags.h"
30
38
  #include "src/core/util/json/json.h"
39
+ #include "src/core/util/memory_usage.h"
31
40
  #include "src/core/util/ref_counted_ptr.h"
32
41
  #include "src/core/util/sync.h"
42
+ #include "src/core/util/time.h"
43
+ #include "src/proto/grpc/channelz/v2/channelz.upb.h"
33
44
 
34
45
  namespace grpc_core {
35
46
  namespace channelz {
@@ -38,71 +49,246 @@ namespace testing {
38
49
  size_t GetSizeofTraceEvent(void);
39
50
  }
40
51
 
52
+ namespace detail {
53
+
54
+ class Renderer {
55
+ public:
56
+ virtual ~Renderer() = default;
57
+ virtual std::string Render() const = 0;
58
+ virtual size_t MemoryUsage() const = 0;
59
+ };
60
+
61
+ struct StrCatFn {
62
+ template <typename... Arg>
63
+ std::string operator()(const Arg&... args) {
64
+ return absl::StrCat(args...);
65
+ }
66
+ };
67
+
68
+ template <typename A>
69
+ auto AdaptForStorage(A&& a) {
70
+ using RawA = std::remove_reference_t<A>;
71
+ if constexpr (std::is_same_v<std::decay_t<RawA>, const char*>) {
72
+ return absl::string_view(a);
73
+ } else {
74
+ return RawA(std::forward<A>(a));
75
+ }
76
+ }
77
+
78
+ template <typename... Args>
79
+ std::unique_ptr<Renderer> RendererFromConcatenationInner(Args&&... args) {
80
+ class R final : public Renderer {
81
+ public:
82
+ explicit R(Args&&... args) : args_(std::forward<Args>(args)...) {}
83
+
84
+ std::string Render() const override {
85
+ return std::apply(StrCatFn(), args_);
86
+ }
87
+ size_t MemoryUsage() const override {
88
+ return MemoryUsageOf(args_) + sizeof(Renderer);
89
+ }
90
+
91
+ private:
92
+ std::tuple<Args...> args_;
93
+ };
94
+ return std::make_unique<R>(std::forward<Args>(args)...);
95
+ }
96
+
97
+ template <typename... Args>
98
+ std::unique_ptr<Renderer> RendererFromConcatenation(Args&&... args) {
99
+ return RendererFromConcatenationInner(
100
+ AdaptForStorage<Args>(std::forward<Args>(args))...);
101
+ }
102
+
103
+ struct RendererFromConcatenationFn {
104
+ template <typename... Args>
105
+ auto operator()(Args&&... args) {
106
+ return RendererFromConcatenation(std::forward<Args>(args)...);
107
+ }
108
+ };
109
+
110
+ template <typename N>
111
+ void OutputLogFromLogExpr(N* out, std::unique_ptr<Renderer> renderer) {
112
+ out->NewNode(std::move(renderer)).Commit();
113
+ }
114
+
115
+ template <typename N, typename... T>
116
+ class LogExpr {
117
+ public:
118
+ explicit LogExpr(N* node, T&&... values)
119
+ : out_(node), values_(std::forward<T>(values)...) {}
120
+
121
+ ~LogExpr() {
122
+ if (out_ != nullptr) {
123
+ OutputLogFromLogExpr(out_,
124
+ std::apply(detail::RendererFromConcatenationFn(),
125
+ std::move(values_)));
126
+ }
127
+ }
128
+
129
+ template <typename U>
130
+ friend auto operator<<(LogExpr<N, T...>&& x, U&& u) {
131
+ auto mk = [out = std::exchange(x.out_, nullptr),
132
+ u = AdaptForStorage(std::forward<U>(u))](
133
+ T&&... existing_values) mutable {
134
+ return LogExpr<N, T..., decltype(u)>(
135
+ out, std::forward<T>(existing_values)..., std::move(u));
136
+ };
137
+ return std::apply(mk, std::move(x.values_));
138
+ }
139
+
140
+ private:
141
+ N* out_;
142
+ std::tuple<T...> values_;
143
+ };
144
+ } // namespace detail
145
+
41
146
  class BaseNode;
42
147
 
43
148
  // Object used to hold live data for a channel. This data is exposed via the
44
149
  // channelz service:
45
150
  // https://github.com/grpc/proposal/blob/master/A14-channelz.md
46
151
  class ChannelTrace {
47
- public:
48
- explicit ChannelTrace(size_t max_event_memory);
49
- ~ChannelTrace();
50
-
51
- enum Severity {
52
- Unset = 0, // never to be used
53
- Info, // we start at 1 to avoid using proto default values
54
- Warning,
55
- Error
152
+ struct EntryRef {
153
+ uint16_t id;
154
+ uint16_t salt;
155
+ static EntryRef Sentinel() { return EntryRef{kSentinelId, 0}; }
56
156
  };
57
157
 
58
- static const char* SeverityString(ChannelTrace::Severity severity) {
59
- switch (severity) {
60
- case ChannelTrace::Severity::Info:
61
- return "CT_INFO";
62
- case ChannelTrace::Severity::Warning:
63
- return "CT_WARNING";
64
- case ChannelTrace::Severity::Error:
65
- return "CT_ERROR";
66
- default:
67
- GPR_UNREACHABLE_CODE(return "CT_UNKNOWN");
68
- }
69
- }
158
+ public:
159
+ explicit ChannelTrace(size_t max_memory)
160
+ : max_memory_(std::min(max_memory, sizeof(Entry) * 32768)) {}
161
+
162
+ using Renderer = detail::Renderer;
70
163
 
71
- // Adds a new trace event to the tracing object
164
+ // Represents a node in the channel trace.
165
+ // Nodes form a tree structure, allowing for hierarchical tracing.
72
166
  //
73
- // NOTE: each ChannelTrace tracks the memory used by its list of trace
74
- // events, so adding an event with a large amount of data could cause other
75
- // trace event to be evicted. If a single trace is larger than the limit, it
76
- // will cause all events to be evicted. The limit is set with the arg:
77
- // GRPC_ARG_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE.
167
+ // A `Node` is created by calling `ChannelTrace::NewNode()` for a root-level
168
+ // event, or `Node::NewChild()` to create a child of an existing node.
78
169
  //
79
- // TODO(ncteisen): as this call is used more and more throughout the gRPC
80
- // stack, determine if it makes more sense to accept a char* instead of a
81
- // slice.
82
- void AddTraceEvent(Severity severity, const grpc_slice& data);
83
-
84
- // Adds a new trace event to the tracing object. This trace event refers to a
85
- // an event that concerns a different channelz entity. For example, if this
86
- // channel has created a new subchannel, then it would record that with
87
- // a TraceEvent referencing the new subchannel.
170
+ // The `Node` object acts as a handle to an entry in the `ChannelTrace`.
171
+ // By default, a `Node` is temporary. If the `Node` object is destroyed
172
+ // (e.g., goes out of scope) without `Commit()` being called, the
173
+ // corresponding trace entry is removed from the `ChannelTrace`. This RAII
174
+ // behavior is useful for tracing events that might be cancelled or
175
+ // superseded.
88
176
  //
89
- // NOTE: see the note in the method above.
177
+ // To make a trace entry permanent (until it's evicted by memory limits),
178
+ // call `Commit()` on the `Node` object. After `Commit()` is called, the
179
+ // `Node` object can be destroyed without affecting the trace entry.
90
180
  //
91
- // TODO(ncteisen): see the todo in the method above.
92
- void AddTraceEventWithReference(Severity severity, const grpc_slice& data,
93
- RefCountedPtr<BaseNode> referenced_entity);
181
+ // `Node` objects are move-only to ensure clear ownership of the trace entry
182
+ // handle.
183
+ //
184
+ // Example:
185
+ // ChannelTrace tracer(max_memory);
186
+ // // Create a root node
187
+ // auto root_node = tracer.NewNode("Root event");
188
+ // // Create a child node
189
+ // auto child_node = root_node.NewChild("Child event: ", 123);
190
+ // // If something goes wrong before committing:
191
+ // if (error) {
192
+ // // child_node and root_node go out of scope, entries are removed
193
+ // return;
194
+ // }
195
+ // // Commit the nodes to make them permanent
196
+ // child_node.Commit();
197
+ // root_node.Commit();
198
+ class Node final {
199
+ public:
200
+ // Default constructor creates an invalid/sentinel Node.
201
+ // Operations on a default-constructed Node are no-ops or return
202
+ // invalid/sentinel results.
203
+ Node() : trace_(nullptr), ref_(EntryRef::Sentinel()) {}
204
+ Node(const Node&) = delete;
205
+ Node& operator=(const Node&) = delete;
206
+ Node(Node&& other) noexcept
207
+ : trace_(std::exchange(other.trace_, nullptr)),
208
+ ref_(other.ref_),
209
+ committed_(other.committed_) {}
210
+ Node& operator=(Node&& other) noexcept {
211
+ std::swap(trace_, other.trace_);
212
+ std::swap(ref_, other.ref_);
213
+ std::swap(committed_, other.committed_);
214
+ return *this;
215
+ }
216
+ // If the `Node` was not committed, its corresponding entry is removed
217
+ // from the `ChannelTrace`.
218
+ ~Node() {
219
+ if (trace_ != nullptr && !committed_ && ref_.id != kSentinelId) {
220
+ trace_->DropEntry(ref_);
221
+ }
222
+ }
223
+
224
+ // Creates a new child node associated with this node.
225
+ // The child node will use the provided `renderer` to generate its
226
+ // description.
227
+ // Returns a new `Node` object representing the child.
228
+ // If this node is invalid (e.g., default-constructed or moved-from),
229
+ // an invalid `Node` is returned.
230
+ [[nodiscard]] Node NewNode(std::unique_ptr<Renderer> renderer) {
231
+ if (trace_ == nullptr || ref_.id == kSentinelId) return Node();
232
+ return Node(trace_, trace_->AppendEntry(ref_, std::move(renderer)));
233
+ }
234
+
235
+ // Creates a new child node associated with this node.
236
+ // The child node's description is formed by concatenating `args...`.
237
+ // Supported types for `args` are those compatible with `absl::StrCat`
238
+ // and `absl::string_view`.
239
+ // Returns a new `Node` object representing the child.
240
+ // If this node is invalid (e.g., default-constructed or moved-from),
241
+ // an invalid `Node` is returned.
242
+ template <typename... Args>
243
+ [[nodiscard]] Node NewNode(Args&&... args) {
244
+ if (trace_ == nullptr || ref_.id == kSentinelId) return Node();
245
+ return NewNode(
246
+ detail::RendererFromConcatenation(std::forward<Args>(args)...));
247
+ }
248
+
249
+ // Marks the trace entry associated with this `Node` as permanent.
250
+ // After `Commit()`, destroying this `Node` object will no longer remove
251
+ // the entry from the `ChannelTrace`.
252
+ // If the node is invalid, this is a no-op.
253
+ void Commit() {
254
+ if (trace_ == nullptr || ref_.id == kSentinelId) return;
255
+ committed_ = true;
256
+ }
257
+
258
+ bool ProducesOutput() const { return ref_.id != kSentinelId; }
259
+
260
+ private:
261
+ friend class ChannelTrace;
262
+
263
+ Node(ChannelTrace* trace, EntryRef ref) : trace_(trace), ref_(ref) {}
264
+
265
+ ChannelTrace* trace_;
266
+ EntryRef ref_;
267
+ bool committed_ = false;
268
+ };
269
+
270
+ [[nodiscard]] Node NewNode(std::unique_ptr<Renderer> render) {
271
+ return Node(this, AppendEntry(EntryRef::Sentinel(), std::move(render)));
272
+ }
273
+
274
+ template <typename... Args>
275
+ [[nodiscard]] Node NewNode(Args&&... args) {
276
+ return NewNode(
277
+ detail::RendererFromConcatenation(std::forward<Args>(args)...));
278
+ }
94
279
 
95
280
  // Creates and returns the raw Json object, so a parent channelz
96
281
  // object may incorporate the json before rendering.
97
282
  Json RenderJson() const;
98
283
 
99
284
  void ForEachTraceEvent(
100
- absl::FunctionRef<void(gpr_timespec, Severity, std::string,
101
- RefCountedPtr<BaseNode>)>
102
- callback) const {
103
- MutexLock lock(&mu_);
104
- ForEachTraceEventLocked(callback);
105
- }
285
+ absl::FunctionRef<void(gpr_timespec, std::string)> callback) const
286
+ ABSL_LOCKS_EXCLUDED(mu_);
287
+
288
+ void Render(grpc_channelz_v2_Entity* entity, upb_Arena* arena) const;
289
+
290
+ bool ProducesOutput() const { return max_memory_ > 0; }
291
+
106
292
  std::string creation_timestamp() const;
107
293
  uint64_t num_events_logged() const {
108
294
  MutexLock lock(&mu_);
@@ -112,58 +298,166 @@ class ChannelTrace {
112
298
  private:
113
299
  friend size_t testing::GetSizeofTraceEvent(void);
114
300
 
115
- // Private class to encapsulate all the data and bookkeeping needed for a
116
- // a trace event.
117
- class TraceEvent {
118
- public:
119
- // Constructor for a TraceEvent that references a channel.
120
- TraceEvent(Severity severity, const grpc_slice& data,
121
- RefCountedPtr<BaseNode> referenced_entity_);
122
-
123
- // Constructor for a TraceEvent that does not reverence a different
124
- // channel.
125
- TraceEvent(Severity severity, const grpc_slice& data);
301
+ void ForEachTraceEventLocked(
302
+ absl::FunctionRef<void(gpr_timespec, std::string)> callback) const
303
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
126
304
 
127
- ~TraceEvent();
305
+ static constexpr uint16_t kSentinelId = 65535;
128
306
 
129
- // set and get for the next_ pointer.
130
- TraceEvent* next() const { return next_; }
131
- void set_next(TraceEvent* next) { next_ = next; }
307
+ // Internal representation of a trace entry.
308
+ // These entries are stored in a std::vector `entries_` within ChannelTrace.
309
+ // They form a tree structure (parent/child/sibling links) and also a
310
+ // doubly-linked chronological list.
311
+ //
312
+ // The size of this struct is critical for memory management.
313
+ // `ChannelTrace` uses `sizeof(Entry)` to estimate memory usage and enforce
314
+ // `max_memory_`. Avoid adding fields or changing types that would
315
+ // significantly increase its size. The `uint16_t` types for IDs are used
316
+ // to keep the struct compact, limiting the total number of active (including
317
+ // free-list) entries to 65535.
318
+ struct Entry {
319
+ Timestamp when; // Timestamp of the event.
320
+ // A counter incremented each time an entry at a particular index in
321
+ // `entries_` is reused. Used by `EntryRef` to validate if a
322
+ // reference is still pointing to the same logical entry.
323
+ uint16_t salt = 0;
324
+ // Index of the parent entry in `entries_`, or `kSentinelId`.
325
+ uint16_t parent;
326
+ // Index of the first child of this entry, or `kSentinelId`.
327
+ uint16_t first_child;
328
+ // Index of the last child of this entry, or `kSentinelId`.
329
+ uint16_t last_child;
330
+ // Index of the previous sibling, or `kSentinelId`.
331
+ uint16_t prev_sibling;
332
+ // Index of the next sibling, or `kSentinelId`.
333
+ uint16_t next_sibling;
334
+ // Index of the previous entry in chronological order, or `kSentinelId`.
335
+ uint16_t prev_chronologically;
336
+ // Index of the next entry in chronological order, or `kSentinelId`.
337
+ uint16_t next_chronologically;
338
+ // Pointer to a Renderer object that can generate the string
339
+ // description for this trace event.
340
+ std::unique_ptr<Renderer> renderer;
132
341
 
133
- size_t memory_usage() const { return memory_usage_; }
134
- gpr_timespec timestamp() const { return timestamp_; }
135
- Severity severity() const { return severity_; }
136
- std::string description() const;
137
- RefCountedPtr<BaseNode> referenced_entity() const;
342
+ // The basic MemoryUsage function doesn't work reliably cross platform for
343
+ // std::unique_ptr within a struct. Open-code that part here.
344
+ size_t MemoryUsage() const {
345
+ if (renderer == nullptr) return sizeof(*this);
346
+ return MemoryUsageOf(*renderer) + sizeof(*this);
347
+ }
348
+ };
138
349
 
139
- private:
140
- const gpr_timespec timestamp_;
141
- const Severity severity_;
142
- const grpc_slice data_;
143
- const size_t memory_usage_;
144
- // the tracer object for the (sub)channel that this trace event refers to.
145
- const RefCountedPtr<BaseNode> referenced_entity_;
146
- TraceEvent* next_ = nullptr;
147
- }; // TraceEvent
148
-
149
- // Internal helper to add and link in a trace event
150
- void AddTraceEventHelper(TraceEvent* new_trace_event);
151
- void ForEachTraceEventLocked(
152
- absl::FunctionRef<void(gpr_timespec, Severity, std::string,
153
- RefCountedPtr<BaseNode>)>) const
350
+ EntryRef AppendEntry(EntryRef parent, std::unique_ptr<Renderer> renderer)
351
+ ABSL_LOCKS_EXCLUDED(mu_);
352
+ EntryRef NewEntry(EntryRef parent, std::unique_ptr<Renderer> renderer)
154
353
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
354
+ void DropEntry(EntryRef entry) ABSL_LOCKS_EXCLUDED(mu_);
355
+ void DropEntryId(uint16_t id) ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
155
356
 
156
- const size_t max_event_memory_;
157
- const gpr_timespec time_created_;
357
+ void RenderEntry(const Entry& entry,
358
+ absl::FunctionRef<void(gpr_timespec, std::string)> callback,
359
+ int depth) const ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
360
+ void RenderEntry(const Entry& entry, grpc_channelz_v2_TraceEvent* trace_event,
361
+ upb_Arena* arena) const ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
158
362
 
159
363
  mutable Mutex mu_;
364
+ const Timestamp time_created_ = Timestamp::Now();
160
365
  uint64_t num_events_logged_ ABSL_GUARDED_BY(mu_) = 0;
161
- size_t event_list_memory_usage_ ABSL_GUARDED_BY(mu_) = 0;
162
- TraceEvent* head_trace_ ABSL_GUARDED_BY(mu_) = nullptr;
163
- TraceEvent* tail_trace_ ABSL_GUARDED_BY(mu_) = nullptr;
366
+ const uint32_t max_memory_;
367
+ uint32_t current_memory_ ABSL_GUARDED_BY(mu_) = 0;
368
+ uint16_t next_free_entry_ ABSL_GUARDED_BY(mu_) = kSentinelId;
369
+ uint16_t first_entry_ ABSL_GUARDED_BY(mu_) = kSentinelId;
370
+ uint16_t last_entry_ ABSL_GUARDED_BY(mu_) = kSentinelId;
371
+ std::vector<Entry> entries_ ABSL_GUARDED_BY(mu_);
164
372
  };
165
373
 
374
+ // A node that GRPC_CHANNELZ_TRACE can output to, that also
375
+ // logs to absl LOG(INFO) if a particular TraceFlag is enabled.
376
+ // Provides a way to elevate GRPC_TRACE_LOG statements to channelz
377
+ // also.
378
+ class TraceNode {
379
+ public:
380
+ TraceNode() = default;
381
+
382
+ template <typename F>
383
+ TraceNode(ChannelTrace::Node node, TraceFlag& flag, F prefix)
384
+ : node_(std::move(node)) {
385
+ if (GPR_UNLIKELY(flag.enabled())) {
386
+ log_to_absl_ = std::make_unique<std::string>(prefix());
387
+ }
388
+ }
389
+
390
+ bool ProducesOutput() const {
391
+ return node_.ProducesOutput() || log_to_absl_ != nullptr;
392
+ }
393
+
394
+ void Finish(std::unique_ptr<detail::Renderer> renderer) {
395
+ if (GPR_UNLIKELY(log_to_absl_ != nullptr)) {
396
+ LOG(INFO) << *log_to_absl_ << renderer->Render();
397
+ }
398
+ node_.NewNode(std::move(renderer)).Commit();
399
+ }
400
+
401
+ void Commit() { node_.Commit(); }
402
+
403
+ private:
404
+ ChannelTrace::Node node_;
405
+ std::unique_ptr<std::string> log_to_absl_;
406
+ };
407
+
408
+ namespace detail {
409
+ inline ChannelTrace* LogOutputFrom(ChannelTrace& t) {
410
+ if (!t.ProducesOutput()) return nullptr;
411
+ return &t;
412
+ }
413
+
414
+ inline ChannelTrace::Node* LogOutputFrom(ChannelTrace::Node& n) {
415
+ if (!n.ProducesOutput()) return nullptr;
416
+ return &n;
417
+ }
418
+
419
+ inline TraceNode* LogOutputFrom(TraceNode& n) {
420
+ if (!n.ProducesOutput()) return nullptr;
421
+ return &n;
422
+ }
423
+
424
+ inline void OutputLogFromLogExpr(TraceNode* out,
425
+ std::unique_ptr<Renderer> renderer) {
426
+ out->Finish(std::move(renderer));
427
+ }
428
+ } // namespace detail
429
+
166
430
  } // namespace channelz
167
431
  } // namespace grpc_core
168
432
 
433
+ // Log like LOG() to a channelz object (and potentially as part of a GRPC_TRACE
434
+ // log with channelz::TraceNode).
435
+ //
436
+ // `output` is one of a ChannelTrace, ChannelTrace::Node or a TraceNode.
437
+ //
438
+ // This trace always commits - and the channelz node is inaccessible as a
439
+ // result. Use it for annotation like things, and if commit-ability is
440
+ // important, put it under a parent node and use that for `output`.
441
+ //
442
+ // Notes on this weird macro!
443
+ // - We want this to be a statement level thing, such that end of statement ==>
444
+ // we can commit the log line.
445
+ // - To do that we need to ensure we're not an expression, so we want an if,
446
+ // for, while, or do statement enclosing things.
447
+ // - But hey! we want to stream after the GRPC_CHANNELZ_LOG(foo), so we want an
448
+ // if right - if (we_can_output) output << s1 << s2 << s3;
449
+ // - But hey! now if someone copy/pastes this in front of an else then we
450
+ // bind with that else, and boom we've got a security hole... so let's not do
451
+ // that.
452
+ // - So, the for here acts as an if (the output = nullptr part ensures we don't)
453
+ // actually loop), ensures we have a statement, and ensures we don't
454
+ // accidentally bind with a trailing else.
455
+ // - And of course we skip wrapping things in {} because we really like that
456
+ // GRPC_CHANNELZ_LOG(foo) << "hello!"; syntax.
457
+ #define GRPC_CHANNELZ_LOG(output) \
458
+ for (auto* out = grpc_core::channelz::detail::LogOutputFrom(output); \
459
+ out != nullptr; out = nullptr) \
460
+ grpc_core::channelz::detail::LogExpr< \
461
+ std::remove_reference_t<decltype(*out)>>(out)
462
+
169
463
  #endif // GRPC_SRC_CORE_CHANNELZ_CHANNEL_TRACE_H