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
@@ -0,0 +1,357 @@
1
+ // Copyright 2025 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include "src/core/channelz/property_list.h"
16
+
17
+ #include <algorithm>
18
+ #include <vector>
19
+
20
+ #include "google/protobuf/any.upb.h"
21
+ #include "google/protobuf/empty.upb.h"
22
+ #include "src/core/util/match.h"
23
+ #include "src/proto/grpc/channelz/v2/property_list.upb.h"
24
+
25
+ namespace grpc_core::channelz {
26
+
27
+ namespace {
28
+ size_t GetIndex(std::vector<std::string>& vec, absl::string_view value) {
29
+ auto it = std::find(vec.begin(), vec.end(), value);
30
+ if (it == vec.end()) {
31
+ vec.emplace_back(value);
32
+ return vec.size() - 1;
33
+ } else {
34
+ return it - vec.begin();
35
+ }
36
+ }
37
+
38
+ Json ToJson(const PropertyValue& value) {
39
+ return Match(
40
+ value,
41
+ [](absl::string_view v) { return Json::FromString(std::string(v)); },
42
+ [](const std::string& v) { return Json::FromString(v); },
43
+ [](int64_t v) { return Json::FromNumber(v); },
44
+ [](uint64_t v) { return Json::FromNumber(v); },
45
+ [](double v) { return Json::FromNumber(v); },
46
+ [](bool v) { return Json::FromBool(v); },
47
+ [](Duration v) { return Json::FromString(v.ToJsonString()); },
48
+ [](Timestamp v) {
49
+ return Json::FromString(
50
+ gpr_format_timespec(v.as_timespec(GPR_CLOCK_REALTIME)));
51
+ },
52
+ [](absl::Status v) { return Json::FromString(v.ToString()); },
53
+ [](std::shared_ptr<OtherPropertyValue> v) {
54
+ return Json::FromObject(v->TakeJsonObject());
55
+ });
56
+ }
57
+
58
+ void FillUpbValue(const PropertyValue& value,
59
+ grpc_channelz_v2_PropertyValue* proto, upb_Arena* arena) {
60
+ Match(
61
+ value,
62
+ [proto](absl::string_view v) {
63
+ grpc_channelz_v2_PropertyValue_set_string_value(
64
+ proto, StdStringToUpbString(v));
65
+ },
66
+ [proto, arena](const std::string& v) {
67
+ grpc_channelz_v2_PropertyValue_set_string_value(
68
+ proto, CopyStdStringToUpbString(v, arena));
69
+ },
70
+ [proto](int64_t v) {
71
+ grpc_channelz_v2_PropertyValue_set_int64_value(proto, v);
72
+ },
73
+ [proto](uint64_t v) {
74
+ grpc_channelz_v2_PropertyValue_set_uint64_value(proto, v);
75
+ },
76
+ [proto](double v) {
77
+ grpc_channelz_v2_PropertyValue_set_double_value(proto, v);
78
+ },
79
+ [proto](bool v) {
80
+ grpc_channelz_v2_PropertyValue_set_bool_value(proto, v);
81
+ },
82
+ [proto, arena](Duration v) {
83
+ auto* duration_proto =
84
+ grpc_channelz_v2_PropertyValue_mutable_duration_value(proto, arena);
85
+ auto ts = v.as_timespec();
86
+ google_protobuf_Duration_set_seconds(duration_proto, ts.tv_sec);
87
+ google_protobuf_Duration_set_nanos(duration_proto, ts.tv_nsec);
88
+ },
89
+ [proto, arena](Timestamp v) {
90
+ auto* timestamp_proto =
91
+ grpc_channelz_v2_PropertyValue_mutable_timestamp_value(proto,
92
+ arena);
93
+ auto ts = v.as_timespec(GPR_CLOCK_REALTIME);
94
+ google_protobuf_Timestamp_set_seconds(timestamp_proto, ts.tv_sec);
95
+ google_protobuf_Timestamp_set_nanos(timestamp_proto, ts.tv_nsec);
96
+ grpc_channelz_v2_PropertyValue_set_timestamp_value(proto,
97
+ timestamp_proto);
98
+ },
99
+ [proto, arena](absl::Status v) {
100
+ std::string text = v.ToString();
101
+ grpc_channelz_v2_PropertyValue_set_string_value(
102
+ proto, CopyStdStringToUpbString(text, arena));
103
+ },
104
+ [proto, arena](std::shared_ptr<OtherPropertyValue> v) {
105
+ auto* any =
106
+ grpc_channelz_v2_PropertyValue_mutable_any_value(proto, arena);
107
+ v->FillAny(any, arena);
108
+ });
109
+ }
110
+
111
+ grpc_channelz_v2_PropertyValue* ToUpbProto(const PropertyValue& value,
112
+ upb_Arena* arena) {
113
+ auto* proto = grpc_channelz_v2_PropertyValue_new(arena);
114
+ FillUpbValue(value, proto, arena);
115
+ return proto;
116
+ }
117
+ } // namespace
118
+
119
+ void PropertyList::SetInternal(absl::string_view key,
120
+ std::optional<PropertyValue> value) {
121
+ if (value.has_value()) {
122
+ property_list_.insert_or_assign(key, *std::move(value));
123
+ } else {
124
+ property_list_.erase(std::string(key));
125
+ }
126
+ }
127
+
128
+ PropertyList& PropertyList::Merge(PropertyList other) {
129
+ for (auto& [key, value] : other.property_list_) {
130
+ SetInternal(key, value);
131
+ }
132
+ return *this;
133
+ }
134
+
135
+ Json::Object PropertyList::TakeJsonObject() {
136
+ Json::Object json;
137
+ for (auto& [key, value] : property_list_) {
138
+ json.emplace(key, ToJson(value));
139
+ }
140
+ return json;
141
+ }
142
+
143
+ void PropertyList::FillUpbProto(grpc_channelz_v2_PropertyList* proto,
144
+ upb_Arena* arena) {
145
+ for (auto& [key, value] : property_list_) {
146
+ grpc_channelz_v2_PropertyList_properties_set(
147
+ proto, StdStringToUpbString(key), ToUpbProto(value, arena), arena);
148
+ }
149
+ }
150
+
151
+ void PropertyList::FillAny(google_protobuf_Any* any, upb_Arena* arena) {
152
+ auto* p = grpc_channelz_v2_PropertyList_new(arena);
153
+ FillUpbProto(p, arena);
154
+ size_t length;
155
+ auto* bytes = grpc_channelz_v2_PropertyList_serialize(p, arena, &length);
156
+ google_protobuf_Any_set_value(any,
157
+ upb_StringView_FromDataAndSize(bytes, length));
158
+ google_protobuf_Any_set_type_url(
159
+ any, StdStringToUpbString(
160
+ "type.googleapis.com/grpc.channelz.v2.PropertyList"));
161
+ }
162
+
163
+ Json::Object PropertyGrid::TakeJsonObject() {
164
+ Json::Object json;
165
+ Json::Array columns;
166
+ for (auto& c : columns_) {
167
+ columns.emplace_back(Json::FromString(std::string(c)));
168
+ }
169
+ json.emplace("columns", Json::FromArray(std::move(columns)));
170
+ Json::Array rows;
171
+ for (size_t r = 0; r < rows_.size(); ++r) {
172
+ Json::Object row;
173
+ row.emplace("name", Json::FromString(std::string(rows_[r])));
174
+ Json::Array cells;
175
+ cells.reserve(columns_.size());
176
+ for (size_t c = 0; c < columns_.size(); ++c) {
177
+ auto it = grid_.find(std::pair(c, r));
178
+ if (it != grid_.end()) {
179
+ cells.emplace_back(ToJson(it->second));
180
+ } else {
181
+ cells.emplace_back(Json());
182
+ }
183
+ }
184
+ row.emplace("cells", Json::FromArray(std::move(cells)));
185
+ rows.emplace_back(Json::FromObject(std::move(row)));
186
+ }
187
+ json.emplace("rows", Json::FromArray(std::move(rows)));
188
+ return json;
189
+ }
190
+
191
+ void PropertyGrid::FillUpbProto(grpc_channelz_v2_PropertyGrid* proto,
192
+ upb_Arena* arena) {
193
+ auto* columns_proto = grpc_channelz_v2_PropertyGrid_resize_columns(
194
+ proto, columns_.size(), arena);
195
+ for (size_t i = 0; i < columns_.size(); ++i) {
196
+ columns_proto[i] = StdStringToUpbString(columns_[i]);
197
+ }
198
+ auto* rows_proto =
199
+ grpc_channelz_v2_PropertyGrid_resize_rows(proto, rows_.size(), arena);
200
+ for (size_t r = 0; r < rows_.size(); ++r) {
201
+ auto* row_proto = grpc_channelz_v2_PropertyGrid_Row_new(arena);
202
+ rows_proto[r] = row_proto;
203
+ grpc_channelz_v2_PropertyGrid_Row_set_label(row_proto,
204
+ StdStringToUpbString(rows_[r]));
205
+ auto* row_columns_proto = grpc_channelz_v2_PropertyGrid_Row_resize_value(
206
+ row_proto, columns_.size(), arena);
207
+ for (size_t c = 0; c < columns_.size(); ++c) {
208
+ auto it = grid_.find(std::pair(c, r));
209
+ if (it != grid_.end()) {
210
+ row_columns_proto[c] = ToUpbProto(it->second, arena);
211
+ } else {
212
+ auto* val = grpc_channelz_v2_PropertyValue_new(arena);
213
+ grpc_channelz_v2_PropertyValue_set_empty_value(
214
+ val, google_protobuf_Empty_new(arena));
215
+ row_columns_proto[c] = val;
216
+ }
217
+ }
218
+ }
219
+ }
220
+
221
+ void PropertyGrid::FillAny(google_protobuf_Any* any, upb_Arena* arena) {
222
+ auto* p = grpc_channelz_v2_PropertyGrid_new(arena);
223
+ FillUpbProto(p, arena);
224
+ size_t length;
225
+ auto* bytes = grpc_channelz_v2_PropertyGrid_serialize(p, arena, &length);
226
+ google_protobuf_Any_set_value(any,
227
+ upb_StringView_FromDataAndSize(bytes, length));
228
+ google_protobuf_Any_set_type_url(
229
+ any, StdStringToUpbString(
230
+ "type.googleapis.com/grpc.channelz.v2.PropertyGrid"));
231
+ }
232
+
233
+ void PropertyGrid::SetInternal(absl::string_view column, absl::string_view row,
234
+ std::optional<PropertyValue> value) {
235
+ int c = GetIndex(columns_, column);
236
+ int r = GetIndex(rows_, row);
237
+ if (value.has_value()) {
238
+ grid_.emplace(std::pair(c, r), *std::move(value));
239
+ } else {
240
+ grid_.erase(std::pair(c, r));
241
+ }
242
+ }
243
+
244
+ PropertyGrid& PropertyGrid::SetColumn(absl::string_view column,
245
+ PropertyList values) {
246
+ int c = GetIndex(columns_, column);
247
+ std::vector<std::string> keys;
248
+ for (const auto& [key, value] : values.property_list_) {
249
+ keys.push_back(key);
250
+ }
251
+ std::sort(keys.begin(), keys.end());
252
+ for (const auto& key : keys) {
253
+ grid_.emplace(std::pair(c, GetIndex(rows_, key)),
254
+ std::move(values.property_list_.at(key)));
255
+ }
256
+ return *this;
257
+ }
258
+
259
+ PropertyGrid& PropertyGrid::SetRow(absl::string_view row, PropertyList values) {
260
+ int r = GetIndex(rows_, row);
261
+ std::vector<std::string> keys;
262
+ for (const auto& [key, value] : values.property_list_) {
263
+ keys.push_back(key);
264
+ }
265
+ std::sort(keys.begin(), keys.end());
266
+ for (const auto& key : keys) {
267
+ grid_.emplace(std::pair(GetIndex(columns_, key), r),
268
+ std::move(values.property_list_.at(key)));
269
+ }
270
+ return *this;
271
+ }
272
+
273
+ Json::Object PropertyTable::TakeJsonObject() {
274
+ Json::Object json;
275
+ Json::Array columns;
276
+ for (auto& c : columns_) {
277
+ columns.emplace_back(Json::FromString(std::string(c)));
278
+ }
279
+ json.emplace("columns", Json::FromArray(std::move(columns)));
280
+ Json::Array rows;
281
+ for (size_t r = 0; r < num_rows_; ++r) {
282
+ Json::Array cells;
283
+ cells.reserve(columns_.size());
284
+ for (size_t c = 0; c < columns_.size(); ++c) {
285
+ auto it = grid_.find(std::pair(c, r));
286
+ if (it != grid_.end()) {
287
+ cells.emplace_back(ToJson(it->second));
288
+ } else {
289
+ cells.emplace_back(Json());
290
+ }
291
+ }
292
+ rows.emplace_back(Json::FromArray(std::move(cells)));
293
+ }
294
+ json.emplace("rows", Json::FromArray(std::move(rows)));
295
+ return json;
296
+ }
297
+
298
+ void PropertyTable::SetInternal(absl::string_view column, size_t row,
299
+ std::optional<PropertyValue> value) {
300
+ int c = GetIndex(columns_, column);
301
+ num_rows_ = std::max(num_rows_, row + 1);
302
+ if (value.has_value()) {
303
+ grid_.emplace(std::pair(c, row), *std::move(value));
304
+ } else {
305
+ grid_.erase(std::pair(c, row));
306
+ }
307
+ }
308
+
309
+ PropertyTable& PropertyTable::SetRow(size_t row, PropertyList values) {
310
+ num_rows_ = std::max(num_rows_, row + 1);
311
+ for (auto& [key, value] : values.property_list_) {
312
+ grid_.emplace(std::pair(GetIndex(columns_, key), row), std::move(value));
313
+ }
314
+ return *this;
315
+ }
316
+
317
+ void PropertyTable::FillUpbProto(grpc_channelz_v2_PropertyTable* proto,
318
+ upb_Arena* arena) {
319
+ auto* columns_proto = grpc_channelz_v2_PropertyTable_resize_columns(
320
+ proto, columns_.size(), arena);
321
+ for (size_t i = 0; i < columns_.size(); ++i) {
322
+ columns_proto[i] = StdStringToUpbString(columns_[i]);
323
+ }
324
+ auto* rows_proto =
325
+ grpc_channelz_v2_PropertyTable_resize_rows(proto, num_rows_, arena);
326
+ for (size_t r = 0; r < num_rows_; ++r) {
327
+ auto* row_proto = grpc_channelz_v2_PropertyTable_Row_new(arena);
328
+ rows_proto[r] = row_proto;
329
+ auto* row_columns_proto = grpc_channelz_v2_PropertyTable_Row_resize_value(
330
+ row_proto, columns_.size(), arena);
331
+ for (size_t c = 0; c < columns_.size(); ++c) {
332
+ auto it = grid_.find({c, r});
333
+ if (it != grid_.end()) {
334
+ row_columns_proto[c] = ToUpbProto(it->second, arena);
335
+ } else {
336
+ auto* val = grpc_channelz_v2_PropertyValue_new(arena);
337
+ grpc_channelz_v2_PropertyValue_set_empty_value(
338
+ val, google_protobuf_Empty_new(arena));
339
+ row_columns_proto[c] = val;
340
+ }
341
+ }
342
+ }
343
+ }
344
+
345
+ void PropertyTable::FillAny(google_protobuf_Any* any, upb_Arena* arena) {
346
+ auto* p = grpc_channelz_v2_PropertyTable_new(arena);
347
+ FillUpbProto(p, arena);
348
+ size_t length;
349
+ auto* bytes = grpc_channelz_v2_PropertyTable_serialize(p, arena, &length);
350
+ google_protobuf_Any_set_value(any,
351
+ upb_StringView_FromDataAndSize(bytes, length));
352
+ google_protobuf_Any_set_type_url(
353
+ any, StdStringToUpbString(
354
+ "type.googleapis.com/grpc.channelz.v2.PropertyTable"));
355
+ }
356
+
357
+ } // namespace grpc_core::channelz
@@ -0,0 +1,202 @@
1
+ // Copyright 2025 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef GRPC_SRC_CORE_CHANNELZ_PROPERTY_LIST_H
16
+ #define GRPC_SRC_CORE_CHANNELZ_PROPERTY_LIST_H
17
+
18
+ #include <cstddef>
19
+ #include <type_traits>
20
+
21
+ #include "absl/container/flat_hash_map.h"
22
+ #include "absl/status/status.h"
23
+ #include "absl/strings/string_view.h"
24
+ #include "google/protobuf/any.upb.h"
25
+ #include "src/core/util/json/json.h"
26
+ #include "src/core/util/string.h"
27
+ #include "src/core/util/time.h"
28
+ #include "src/core/util/upb_utils.h"
29
+ #include "src/proto/grpc/channelz/v2/channelz.upb.h"
30
+ #include "src/proto/grpc/channelz/v2/property_list.upb.h"
31
+ #include "upb/mem/arena.h"
32
+ #include "upb/text/encode.h"
33
+
34
+ namespace grpc_core::channelz {
35
+
36
+ class OtherPropertyValue {
37
+ public:
38
+ virtual ~OtherPropertyValue() = default;
39
+ virtual void FillAny(google_protobuf_Any* any, upb_Arena* arena) = 0;
40
+ virtual Json::Object TakeJsonObject() = 0;
41
+ };
42
+
43
+ using PropertyValue =
44
+ std::variant<absl::string_view, std::string, int64_t, uint64_t, double,
45
+ bool, Duration, Timestamp, absl::Status,
46
+ std::shared_ptr<OtherPropertyValue>>;
47
+
48
+ namespace property_list_detail {
49
+
50
+ template <typename T, typename = void>
51
+ struct Wrapper {
52
+ static std::optional<PropertyValue> Wrap(T value) {
53
+ return PropertyValue(std::move(value));
54
+ }
55
+ };
56
+
57
+ template <typename T>
58
+ struct Wrapper<
59
+ T, std::enable_if_t<std::is_integral_v<T> && std::is_unsigned_v<T>>> {
60
+ static std::optional<PropertyValue> Wrap(T value) {
61
+ return PropertyValue(static_cast<uint64_t>(value));
62
+ }
63
+ };
64
+
65
+ template <typename T>
66
+ struct Wrapper<T,
67
+ std::enable_if_t<std::is_integral_v<T> && std::is_signed_v<T>>> {
68
+ static std::optional<PropertyValue> Wrap(T value) {
69
+ return PropertyValue(static_cast<int64_t>(value));
70
+ }
71
+ };
72
+
73
+ template <typename T>
74
+ struct Wrapper<std::optional<T>> {
75
+ static std::optional<PropertyValue> Wrap(std::optional<T> value) {
76
+ if (value.has_value()) return Wrapper<T>::Wrap(*std::move(value));
77
+ return std::nullopt;
78
+ }
79
+ };
80
+
81
+ template <>
82
+ struct Wrapper<const char*> {
83
+ static std::optional<PropertyValue> Wrap(const char* value) {
84
+ if (value == nullptr) return std::nullopt;
85
+ return absl::string_view(value);
86
+ }
87
+ };
88
+
89
+ template <>
90
+ struct Wrapper<std::shared_ptr<OtherPropertyValue>> {
91
+ static std::optional<PropertyValue> Wrap(
92
+ std::shared_ptr<OtherPropertyValue> value) {
93
+ if (value == nullptr) return std::nullopt;
94
+ return PropertyValue(std::move(value));
95
+ }
96
+ };
97
+
98
+ template <typename T>
99
+ struct Wrapper<T, std::enable_if_t<std::is_base_of_v<OtherPropertyValue, T> &&
100
+ std::is_final_v<T>>> {
101
+ static std::optional<PropertyValue> Wrap(T value) {
102
+ return PropertyValue(std::make_shared<T>(std::move(value)));
103
+ }
104
+ };
105
+
106
+ template <>
107
+ struct Wrapper<bool> {
108
+ static std::optional<PropertyValue> Wrap(bool value) {
109
+ return PropertyValue(value);
110
+ }
111
+ };
112
+
113
+ } // namespace property_list_detail
114
+
115
+ // PropertyList contains a bag of key->value (for mostly arbitrary value
116
+ // types) for reporting out state from channelz - the big idea is that you
117
+ // should be able to call `PropertyList().Set("a", this->a)` and generate
118
+ // something that channelz presenters can interpret. It's currently defined in
119
+ // terms of JSON, but as we adopt channelz-v2 it's expected we'll change this
120
+ // to capture protobuf directly.
121
+ class PropertyList final : public OtherPropertyValue {
122
+ public:
123
+ template <typename T>
124
+ PropertyList& Set(absl::string_view key, T value) {
125
+ SetInternal(key, property_list_detail::Wrapper<T>::Wrap(value));
126
+ return *this;
127
+ }
128
+
129
+ PropertyList& Merge(PropertyList other);
130
+
131
+ // TODO(ctiller): remove soon, switch to just FillUpbProto.
132
+ Json::Object TakeJsonObject() override;
133
+ void FillUpbProto(grpc_channelz_v2_PropertyList* proto, upb_Arena* arena);
134
+ void FillAny(google_protobuf_Any* any, upb_Arena* arena) override;
135
+
136
+ private:
137
+ void SetInternal(absl::string_view key, std::optional<PropertyValue> value);
138
+
139
+ friend class PropertyGrid;
140
+ friend class PropertyTable;
141
+
142
+ absl::flat_hash_map<std::string, PropertyValue> property_list_;
143
+ };
144
+
145
+ // PropertyGrid is much the same as PropertyList, but it is two dimensional.
146
+ // Each row and column can be set independently.
147
+ // Rows and columns are ordered by the first setting of a value on them.
148
+ class PropertyGrid final : public OtherPropertyValue {
149
+ public:
150
+ template <typename T>
151
+ PropertyGrid& Set(absl::string_view column, absl::string_view row, T value) {
152
+ SetInternal(column, row, property_list_detail::Wrapper<T>::Wrap(value));
153
+ return *this;
154
+ }
155
+
156
+ PropertyGrid& SetColumn(absl::string_view column, PropertyList values);
157
+ PropertyGrid& SetRow(absl::string_view row, PropertyList values);
158
+
159
+ Json::Object TakeJsonObject() override;
160
+ void FillUpbProto(grpc_channelz_v2_PropertyGrid* proto, upb_Arena* arena);
161
+ void FillAny(google_protobuf_Any* any, upb_Arena* arena) override;
162
+
163
+ private:
164
+ void SetInternal(absl::string_view column, absl::string_view row,
165
+ std::optional<PropertyValue> value);
166
+
167
+ std::vector<std::string> columns_;
168
+ std::vector<std::string> rows_;
169
+ absl::flat_hash_map<std::pair<size_t, size_t>, PropertyValue> grid_;
170
+ };
171
+
172
+ // PropertyTable is much the same as PropertyGrid, but has numbered rows
173
+ // instead of named rows.
174
+ class PropertyTable final : public OtherPropertyValue {
175
+ public:
176
+ template <typename T>
177
+ PropertyTable& Set(absl::string_view column, size_t row, T value) {
178
+ SetInternal(column, row, property_list_detail::Wrapper<T>::Wrap(value));
179
+ return *this;
180
+ }
181
+
182
+ PropertyTable& SetRow(size_t row, PropertyList values);
183
+ PropertyTable& AppendRow(PropertyList values) {
184
+ return SetRow(num_rows_, std::move(values));
185
+ }
186
+
187
+ Json::Object TakeJsonObject() override;
188
+ void FillUpbProto(grpc_channelz_v2_PropertyTable* proto, upb_Arena* arena);
189
+ void FillAny(google_protobuf_Any* any, upb_Arena* arena) override;
190
+
191
+ private:
192
+ void SetInternal(absl::string_view column, size_t row,
193
+ std::optional<PropertyValue> value);
194
+
195
+ std::vector<std::string> columns_;
196
+ size_t num_rows_ = 0;
197
+ absl::flat_hash_map<std::pair<size_t, size_t>, PropertyValue> grid_;
198
+ };
199
+
200
+ } // namespace grpc_core::channelz
201
+
202
+ #endif // GRPC_SRC_CORE_CHANNELZ_PROPERTY_LIST_H
@@ -25,6 +25,7 @@
25
25
  #include "src/core/channelz/channelz.h"
26
26
  #include "src/core/lib/debug/trace.h"
27
27
  #include "src/core/util/json/json_writer.h"
28
+ #include "src/core/util/memory_usage.h"
28
29
  #include "src/core/util/single_set_ptr.h"
29
30
  #include "src/core/util/string.h"
30
31
  #include "src/core/util/sync.h"
@@ -168,7 +169,7 @@ class ZTraceCollector {
168
169
  };
169
170
  template <typename T>
170
171
  void Append(std::pair<gpr_cycle_counter, T> value) {
171
- memory_used_ += value.second.MemoryUsage();
172
+ memory_used_ += MemoryUsageOf(value.second);
172
173
  while (memory_used_ > memory_cap_) RemoveMostRecent();
173
174
  std::get<Collection<T> >(data).push_back(std::move(value));
174
175
  }
@@ -187,7 +188,7 @@ class ZTraceCollector {
187
188
  collection.front().first < state->most_recent) {
188
189
  state->enact = +[](Instance* instance) {
189
190
  auto& collection = std::get<Collection<T> >(instance->data);
190
- const size_t ent_usage = collection.front().second.MemoryUsage();
191
+ const size_t ent_usage = MemoryUsageOf(collection.front().second);
191
192
  CHECK_GE(instance->memory_used_, ent_usage);
192
193
  instance->memory_used_ -= ent_usage;
193
194
  collection.pop_front();
@@ -62,10 +62,15 @@ static grpc_core::Duration g_poll_interval =
62
62
  static bool g_backup_polling_disabled;
63
63
 
64
64
  void grpc_client_channel_global_init_backup_polling() {
65
+ #ifndef GRPC_DO_NOT_INSTANTIATE_POSIX_POLLER
65
66
  // Disable backup polling if EventEngine is used everywhere.
66
67
  g_backup_polling_disabled = grpc_core::IsEventEngineClientEnabled() &&
67
68
  grpc_core::IsEventEngineListenerEnabled() &&
68
69
  grpc_core::IsEventEngineDnsEnabled();
70
+ #else
71
+ // EventEngine polling not supported, keep using the backup poller.
72
+ g_backup_polling_disabled = false;
73
+ #endif
69
74
  if (g_backup_polling_disabled) {
70
75
  return;
71
76
  }
@@ -155,11 +160,21 @@ static void g_poller_init_locked() {
155
160
  }
156
161
  }
157
162
 
163
+ static bool g_can_poll_in_background() {
164
+ #ifndef GRPC_DO_NOT_INSTANTIATE_POSIX_POLLER
165
+ return grpc_iomgr_run_in_background();
166
+ #else
167
+ // No iomgr "event_engines" (not to be confused with the new EventEngine)
168
+ // are able to run in backgroung.
169
+ return false;
170
+ #endif
171
+ }
172
+
158
173
  void grpc_client_channel_start_backup_polling(
159
174
  grpc_pollset_set* interested_parties) {
160
175
  if (g_backup_polling_disabled ||
161
176
  g_poll_interval == grpc_core::Duration::Zero() ||
162
- grpc_iomgr_run_in_background()) {
177
+ g_can_poll_in_background()) {
163
178
  return;
164
179
  }
165
180
  gpr_mu_lock(&g_poller_mu);
@@ -179,7 +194,7 @@ void grpc_client_channel_stop_backup_polling(
179
194
  grpc_pollset_set* interested_parties) {
180
195
  if (g_backup_polling_disabled ||
181
196
  g_poll_interval == grpc_core::Duration::Zero() ||
182
- grpc_iomgr_run_in_background()) {
197
+ g_can_poll_in_background()) {
183
198
  return;
184
199
  }
185
200
  grpc_pollset_set_del_pollset(interested_parties, g_poller->pollset);