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.
- checksums.yaml +4 -4
- data/Makefile +38 -17
- data/include/grpc/create_channel_from_endpoint.h +54 -0
- data/include/grpc/credentials.h +11 -5
- data/include/grpc/event_engine/event_engine.h +74 -17
- data/include/grpc/grpc_posix.h +20 -1
- data/include/grpc/impl/channel_arg_names.h +2 -4
- data/include/grpc/module.modulemap +1 -0
- data/include/grpc/support/json.h +24 -0
- data/src/core/call/interception_chain.h +7 -11
- data/src/core/channelz/channel_trace.cc +213 -115
- data/src/core/channelz/channel_trace.h +380 -86
- data/src/core/channelz/channelz.cc +270 -181
- data/src/core/channelz/channelz.h +168 -55
- data/src/core/channelz/channelz_registry.cc +2 -1
- data/src/core/channelz/channelz_registry.h +24 -0
- data/src/core/channelz/property_list.cc +357 -0
- data/src/core/channelz/property_list.h +202 -0
- data/src/core/channelz/ztrace_collector.h +3 -2
- data/src/core/client_channel/backup_poller.cc +17 -2
- data/src/core/client_channel/client_channel.cc +17 -28
- data/src/core/client_channel/client_channel_filter.cc +19 -29
- data/src/core/client_channel/config_selector.h +8 -2
- data/src/core/client_channel/dynamic_filters.cc +5 -6
- data/src/core/client_channel/dynamic_filters.h +1 -1
- data/src/core/client_channel/global_subchannel_pool.cc +4 -1
- data/src/core/client_channel/retry_filter.cc +21 -27
- data/src/core/client_channel/retry_filter.h +10 -7
- data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -5
- data/src/core/client_channel/retry_filter_legacy_call_data.h +1 -1
- data/src/core/client_channel/retry_interceptor.cc +30 -44
- data/src/core/client_channel/retry_interceptor.h +18 -17
- data/src/core/client_channel/retry_throttle.cc +46 -61
- data/src/core/client_channel/retry_throttle.h +17 -39
- data/src/core/client_channel/subchannel.cc +43 -19
- data/src/core/client_channel/subchannel.h +8 -0
- data/src/core/config/config_vars.cc +2 -0
- data/src/core/config/core_configuration.cc +1 -0
- data/src/core/config/core_configuration.h +11 -0
- data/src/core/credentials/call/call_creds_registry.h +125 -0
- data/src/core/credentials/call/call_creds_registry_init.cc +91 -0
- data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +6 -48
- data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +86 -0
- data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.h +74 -0
- data/src/core/credentials/call/jwt_util.cc +70 -0
- data/src/core/credentials/call/jwt_util.h +32 -0
- data/src/core/credentials/transport/channel_creds_registry_init.cc +1 -1
- data/src/core/credentials/transport/google_default/google_default_credentials.cc +72 -4
- data/src/core/credentials/transport/ssl/ssl_credentials.cc +0 -1
- data/src/core/credentials/transport/tls/load_system_roots_supported.cc +1 -0
- data/src/core/credentials/transport/xds/xds_credentials.cc +0 -3
- data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +8 -8
- data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +16 -16
- data/src/core/ext/filters/http/client_authority_filter.cc +2 -4
- data/src/core/ext/filters/http/message_compress/compression_filter.h +25 -22
- data/src/core/ext/filters/http/server/http_server_filter.h +12 -11
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +120 -35
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +6 -5
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +162 -115
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +0 -3
- data/src/core/ext/transport/chttp2/transport/decode_huff.cc +1239 -3514
- data/src/core/ext/transport/chttp2/transport/decode_huff.h +1008 -1486
- data/src/core/ext/transport/chttp2/transport/flow_control.h +22 -17
- data/src/core/ext/transport/chttp2/transport/frame.cc +10 -0
- data/src/core/ext/transport/chttp2/transport/frame.h +2 -2
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +7 -8
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -5
- data/src/core/ext/transport/chttp2/transport/header_assembler.h +299 -0
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +11 -5
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +12 -1
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +1017 -0
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +593 -0
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +19 -22
- data/{third_party/abseil-cpp/absl/strings/cord_buffer.cc → src/core/ext/transport/chttp2/transport/http2_stats_collector.cc} +14 -14
- data/src/core/ext/transport/chttp2/transport/http2_stats_collector.h +33 -0
- data/src/core/ext/transport/chttp2/transport/http2_status.h +6 -1
- data/src/core/ext/transport/chttp2/transport/http2_transport.cc +43 -0
- data/src/core/ext/transport/chttp2/transport/http2_transport.h +65 -0
- data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +0 -29
- data/src/core/ext/transport/chttp2/transport/internal.h +18 -8
- data/src/core/ext/transport/chttp2/transport/keepalive.cc +105 -0
- data/src/core/ext/transport/chttp2/transport/keepalive.h +138 -0
- data/src/core/ext/transport/chttp2/transport/message_assembler.h +185 -0
- data/src/core/ext/transport/chttp2/transport/parsing.cc +2 -4
- data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +19 -0
- data/src/core/ext/transport/chttp2/transport/ping_promise.cc +151 -0
- data/src/core/ext/transport/chttp2/transport/ping_promise.h +180 -0
- data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +5 -9
- data/src/core/ext/transport/chttp2/transport/ping_rate_policy.h +11 -0
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +39 -1
- data/src/core/ext/transport/chttp2/transport/transport_common.cc +19 -0
- data/src/core/ext/transport/chttp2/transport/transport_common.h +27 -0
- data/src/core/ext/transport/chttp2/transport/writing.cc +37 -11
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb.h +571 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.c +120 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.h +36 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb.h +1272 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.c +312 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.h +50 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb.h +984 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.c +226 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.h +44 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.c +175 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.h +82 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.c +135 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.h +67 -0
- data/src/core/filter/auth/auth_filters.h +0 -25
- data/src/core/filter/auth/client_auth_filter.cc +0 -118
- data/src/core/filter/filter_args.h +9 -23
- data/src/core/handshaker/handshaker.cc +23 -14
- data/src/core/handshaker/handshaker.h +3 -0
- data/src/core/handshaker/http_connect/http_connect_handshaker.cc +3 -1
- data/src/core/handshaker/security/legacy_secure_endpoint.cc +6 -5
- data/src/core/handshaker/security/secure_endpoint.cc +70 -25
- data/src/core/handshaker/security/security_handshaker.cc +4 -1
- data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +7 -1
- data/src/core/lib/channel/channel_args.cc +15 -0
- data/src/core/lib/channel/channel_args.h +3 -0
- data/src/core/lib/channel/channel_stack.cc +22 -23
- data/src/core/lib/channel/channel_stack.h +9 -7
- data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -1
- data/src/core/lib/channel/channel_stack_builder_impl.h +2 -7
- data/src/core/lib/channel/promise_based_filter.h +5 -5
- data/src/core/lib/debug/trace_impl.h +0 -1
- data/src/core/lib/event_engine/ares_resolver.cc +165 -46
- data/src/core/lib/event_engine/ares_resolver.h +48 -2
- data/src/core/lib/event_engine/cf_engine/cf_engine.cc +3 -1
- data/src/core/lib/event_engine/cf_engine/cf_engine.h +1 -4
- data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +2 -6
- data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.cc +40 -0
- data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.h +60 -0
- data/src/core/lib/event_engine/event_engine.cc +7 -0
- data/src/core/lib/event_engine/extensions/channelz.h +10 -6
- data/src/core/lib/event_engine/grpc_polled_fd.h +5 -0
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +130 -162
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +11 -15
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +75 -117
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +7 -9
- data/src/core/lib/event_engine/posix_engine/event_poller.h +18 -15
- data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +0 -18
- data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +124 -0
- data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.h +243 -0
- data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +29 -19
- data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +6 -2
- data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +6 -1
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +145 -92
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +9 -19
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +333 -116
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +61 -18
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +45 -37
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +6 -4
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +32 -142
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +6 -5
- data/src/core/lib/event_engine/posix_engine/posix_interface.h +211 -0
- data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +1083 -0
- data/src/core/lib/event_engine/posix_engine/posix_interface_windows.cc +281 -0
- data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.cc +154 -0
- data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.h +174 -0
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +3 -719
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +10 -170
- data/src/core/lib/event_engine/posix_engine/timer_manager.cc +33 -22
- data/src/core/lib/event_engine/posix_engine/timer_manager.h +13 -11
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +117 -151
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +26 -94
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +26 -25
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +6 -2
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +36 -62
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +6 -2
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +7 -6
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +12 -6
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +3 -1
- data/src/core/lib/event_engine/shim.cc +9 -0
- data/src/core/lib/event_engine/shim.h +3 -0
- data/src/core/lib/event_engine/thread_pool/thread_pool.h +7 -3
- data/src/core/lib/event_engine/thread_pool/thread_pool_factory.cc +0 -17
- data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +4 -2
- data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -2
- data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +4 -0
- data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.h +4 -0
- data/src/core/lib/event_engine/windows/windows_endpoint.h +2 -6
- data/src/core/lib/event_engine/windows/windows_engine.cc +0 -1
- data/src/core/lib/event_engine/windows/windows_engine.h +1 -3
- data/src/core/lib/event_engine/windows/windows_listener.cc +14 -2
- data/src/core/lib/experiments/experiments.cc +45 -93
- data/src/core/lib/experiments/experiments.h +21 -51
- data/src/core/lib/iomgr/endpoint.cc +4 -3
- data/src/core/lib/iomgr/endpoint.h +7 -4
- data/src/core/lib/iomgr/endpoint_cfstream.cc +3 -2
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +7 -2
- data/src/core/lib/iomgr/ev_poll_posix.cc +7 -2
- data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +4 -6
- data/src/core/lib/iomgr/tcp_posix.cc +12 -6
- data/src/core/lib/iomgr/tcp_windows.cc +3 -2
- data/src/core/lib/promise/activity.h +1 -0
- data/src/core/lib/promise/arena_promise.h +23 -7
- data/src/core/lib/promise/detail/promise_factory.h +10 -0
- data/src/core/lib/promise/detail/promise_like.h +118 -11
- data/src/core/lib/promise/detail/promise_variant.h +50 -0
- data/src/core/lib/promise/detail/seq_state.h +687 -548
- data/src/core/lib/promise/if.h +20 -0
- data/src/core/lib/promise/inter_activity_latch.h +147 -0
- data/src/core/lib/promise/inter_activity_mutex.h +547 -0
- data/src/core/lib/promise/loop.h +65 -3
- data/src/core/lib/promise/map.h +24 -0
- data/src/core/lib/promise/match_promise.h +103 -0
- data/src/core/lib/promise/mpsc.cc +425 -0
- data/src/core/lib/promise/mpsc.h +490 -0
- data/src/core/lib/promise/party.cc +50 -1
- data/src/core/lib/promise/party.h +66 -1
- data/src/core/lib/promise/race.h +31 -0
- data/src/core/lib/promise/seq.h +4 -1
- data/src/core/lib/promise/status_flag.h +7 -0
- data/src/core/lib/promise/try_seq.h +4 -1
- data/src/core/lib/promise/wait_set.cc +28 -0
- data/src/core/lib/promise/wait_set.h +86 -0
- data/src/core/lib/resource_quota/arena.h +19 -0
- data/src/core/lib/slice/slice.h +5 -0
- data/src/core/lib/surface/channel_create.cc +88 -13
- data/src/core/lib/surface/channel_create.h +4 -0
- data/src/core/lib/surface/channel_init.cc +164 -47
- data/src/core/lib/surface/channel_init.h +64 -1
- data/src/core/lib/surface/filter_stack_call.cc +18 -9
- data/src/core/lib/surface/init.cc +6 -15
- data/src/core/lib/surface/legacy_channel.cc +3 -5
- data/src/core/lib/surface/legacy_channel.h +3 -1
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/promise_endpoint.cc +110 -0
- data/src/core/lib/transport/promise_endpoint.h +307 -0
- data/src/core/load_balancing/child_policy_handler.cc +2 -4
- data/src/core/load_balancing/delegating_helper.h +2 -3
- data/src/core/load_balancing/health_check_client.cc +1 -5
- data/src/core/load_balancing/lb_policy.h +1 -3
- data/src/core/load_balancing/oob_backend_metric.cc +1 -5
- data/src/core/load_balancing/pick_first/pick_first.cc +3 -0
- data/src/core/load_balancing/xds/cds.cc +10 -1
- data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -0
- data/src/core/resolver/xds/xds_config.cc +6 -3
- data/src/core/resolver/xds/xds_config.h +9 -4
- data/src/core/resolver/xds/xds_dependency_manager.cc +21 -6
- data/src/core/resolver/xds/xds_dependency_manager.h +2 -1
- data/src/core/resolver/xds/xds_resolver.cc +31 -11
- data/src/core/server/server.cc +83 -12
- data/src/core/server/server.h +21 -2
- data/src/core/server/xds_server_config_fetcher.cc +63 -25
- data/src/core/service_config/service_config.h +1 -1
- data/src/core/service_config/service_config_impl.h +1 -1
- data/src/core/telemetry/context_list_entry.cc +38 -0
- data/src/core/telemetry/context_list_entry.h +42 -12
- data/src/core/telemetry/stats_data.cc +233 -207
- data/src/core/telemetry/stats_data.h +250 -153
- data/src/core/telemetry/tcp_tracer.h +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +11 -3
- data/src/core/tsi/fake_transport_security.cc +17 -0
- data/src/core/tsi/ssl_transport_security.cc +2 -0
- data/src/core/tsi/transport_security_grpc.cc +8 -0
- data/src/core/tsi/transport_security_grpc.h +15 -0
- data/src/core/util/backoff.cc +1 -5
- data/src/core/util/backoff.h +1 -0
- data/src/core/util/down_cast.h +1 -1
- data/src/core/util/function_signature.h +15 -1
- data/src/core/util/http_client/httpcli.cc +12 -5
- data/src/core/util/http_client/httpcli.h +4 -1
- data/src/core/util/latent_see.h +8 -5
- data/src/core/util/log.cc +4 -0
- data/src/core/util/memory_usage.h +268 -0
- data/src/core/util/per_cpu.cc +2 -0
- data/src/core/util/per_cpu.h +7 -0
- data/src/core/util/shared_bit_gen.h +20 -0
- data/src/core/util/single_set_ptr.h +2 -2
- data/src/core/util/upb_utils.h +42 -0
- data/src/core/util/uri.cc +3 -2
- data/src/core/util/useful.h +53 -2
- data/src/core/util/wait_for_single_owner.cc +31 -0
- data/src/core/util/wait_for_single_owner.h +24 -0
- data/src/core/xds/grpc/xds_bootstrap_grpc.cc +2 -0
- data/src/core/xds/grpc/xds_bootstrap_grpc.h +5 -0
- data/src/core/xds/grpc/xds_client_grpc.cc +6 -2
- data/src/core/xds/grpc/xds_common_types_parser.cc +138 -50
- data/src/core/xds/grpc/xds_common_types_parser.h +12 -0
- data/src/core/xds/grpc/xds_http_filter.h +7 -0
- data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +22 -0
- data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +3 -0
- data/src/core/xds/grpc/xds_route_config_parser.cc +15 -38
- data/src/core/xds/grpc/xds_server_grpc.cc +63 -13
- data/src/core/xds/grpc/xds_server_grpc.h +10 -2
- data/src/core/xds/grpc/xds_server_grpc_interface.h +4 -0
- data/src/core/xds/grpc/xds_transport_grpc.cc +18 -0
- data/src/core/xds/xds_client/xds_bootstrap.h +2 -0
- data/src/core/xds/xds_client/xds_client.cc +26 -5
- data/src/ruby/ext/grpc/extconf.rb +2 -0
- data/src/ruby/ext/grpc/rb_call.c +1 -8
- data/src/ruby/ext/grpc/rb_channel.c +72 -568
- data/src/ruby/ext/grpc/rb_channel.h +0 -3
- data/src/ruby/ext/grpc/rb_completion_queue.c +26 -14
- data/src/ruby/ext/grpc/rb_completion_queue.h +1 -7
- data/src/ruby/ext/grpc/rb_grpc.c +9 -5
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
- data/src/ruby/ext/grpc/rb_loader.c +0 -4
- data/src/ruby/ext/grpc/rb_server.c +31 -50
- data/src/ruby/lib/grpc/generic/client_stub.rb +4 -4
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/spec/core_spec.rb +22 -0
- data/src/ruby/spec/generic/active_call_spec.rb +1 -1
- data/third_party/abseil-cpp/absl/algorithm/container.h +2 -19
- data/third_party/abseil-cpp/absl/base/attributes.h +76 -7
- data/third_party/abseil-cpp/absl/base/call_once.h +11 -12
- data/third_party/abseil-cpp/absl/base/config.h +20 -129
- data/third_party/abseil-cpp/absl/base/{internal/fast_type_id.h → fast_type_id.h} +11 -16
- data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +0 -5
- data/third_party/abseil-cpp/absl/base/internal/cycleclock_config.h +7 -7
- data/third_party/abseil-cpp/absl/base/internal/endian.h +34 -38
- data/third_party/abseil-cpp/absl/base/internal/iterator_traits.h +71 -0
- data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +6 -5
- data/third_party/abseil-cpp/absl/base/internal/{nullability_impl.h → nullability_deprecated.h} +45 -8
- data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +0 -9
- data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -13
- data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +6 -6
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +8 -3
- data/third_party/abseil-cpp/absl/base/no_destructor.h +11 -32
- data/third_party/abseil-cpp/absl/base/nullability.h +84 -72
- data/third_party/abseil-cpp/absl/base/options.h +3 -80
- data/third_party/abseil-cpp/absl/base/policy_checks.h +7 -7
- data/third_party/abseil-cpp/absl/cleanup/cleanup.h +1 -3
- data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -4
- data/third_party/abseil-cpp/absl/container/btree_map.h +4 -2
- data/third_party/abseil-cpp/absl/container/btree_set.h +4 -2
- data/third_party/abseil-cpp/absl/container/fixed_array.h +7 -14
- data/third_party/abseil-cpp/absl/container/flat_hash_map.h +5 -0
- data/third_party/abseil-cpp/absl/container/flat_hash_set.h +6 -1
- data/third_party/abseil-cpp/absl/container/inlined_vector.h +8 -5
- data/third_party/abseil-cpp/absl/container/internal/btree.h +132 -29
- data/third_party/abseil-cpp/absl/container/internal/btree_container.h +175 -71
- data/third_party/abseil-cpp/absl/container/internal/common.h +43 -0
- data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -2
- data/third_party/abseil-cpp/absl/container/internal/container_memory.h +9 -10
- data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +1 -8
- data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +0 -4
- data/third_party/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +527 -0
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +20 -4
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +31 -12
- data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +2 -7
- data/third_party/abseil-cpp/absl/container/internal/layout.h +26 -42
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +199 -68
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +1354 -183
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +881 -1424
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +80 -0
- data/third_party/abseil-cpp/absl/crc/crc32c.cc +0 -4
- data/third_party/abseil-cpp/absl/crc/crc32c.h +7 -5
- data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +0 -22
- data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +45 -74
- data/third_party/abseil-cpp/absl/debugging/internal/addresses.h +57 -0
- data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.cc +1 -1
- data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.h +5 -5
- data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +8 -35
- data/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.cc +16 -16
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +40 -37
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +16 -7
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +14 -5
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +10 -4
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +27 -16
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +13 -4
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +4 -3
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +15 -28
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +19 -9
- data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +144 -27
- data/third_party/abseil-cpp/absl/debugging/stacktrace.h +73 -5
- data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +19 -9
- data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +3 -2
- data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +25 -6
- data/third_party/abseil-cpp/absl/flags/commandlineflag.h +2 -2
- data/third_party/abseil-cpp/absl/flags/flag.h +4 -3
- data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h +2 -2
- data/third_party/abseil-cpp/absl/flags/internal/flag.cc +2 -1
- data/third_party/abseil-cpp/absl/flags/internal/flag.h +7 -6
- data/third_party/abseil-cpp/absl/flags/internal/registry.h +4 -3
- data/third_party/abseil-cpp/absl/flags/reflection.cc +2 -3
- data/third_party/abseil-cpp/absl/functional/any_invocable.h +8 -10
- data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -9
- data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +110 -226
- data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +10 -12
- data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +2 -5
- data/third_party/abseil-cpp/absl/hash/hash.h +18 -0
- data/third_party/abseil-cpp/absl/hash/internal/hash.cc +1 -5
- data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -61
- data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +25 -68
- data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.h +2 -6
- data/third_party/abseil-cpp/absl/hash/internal/weakly_mixed_integer.h +38 -0
- data/third_party/abseil-cpp/absl/log/check.h +2 -1
- data/third_party/abseil-cpp/absl/log/globals.h +4 -5
- data/third_party/abseil-cpp/absl/log/internal/append_truncated.h +28 -0
- data/third_party/abseil-cpp/absl/log/internal/check_op.cc +22 -22
- data/third_party/abseil-cpp/absl/log/internal/check_op.h +65 -62
- data/third_party/abseil-cpp/absl/log/internal/conditions.cc +5 -3
- data/third_party/abseil-cpp/absl/log/internal/conditions.h +7 -2
- data/third_party/abseil-cpp/absl/log/internal/log_message.cc +85 -43
- data/third_party/abseil-cpp/absl/log/internal/log_message.h +84 -59
- data/third_party/abseil-cpp/absl/log/internal/nullstream.h +1 -0
- data/third_party/abseil-cpp/absl/log/internal/proto.cc +3 -2
- data/third_party/abseil-cpp/absl/log/internal/proto.h +3 -3
- data/third_party/abseil-cpp/absl/log/internal/strip.h +4 -12
- data/third_party/abseil-cpp/absl/log/internal/vlog_config.h +8 -6
- data/third_party/abseil-cpp/absl/log/internal/voidify.h +10 -4
- data/third_party/abseil-cpp/absl/log/log.h +48 -35
- data/third_party/abseil-cpp/absl/log/log_sink_registry.h +2 -2
- data/third_party/abseil-cpp/absl/meta/type_traits.h +46 -175
- data/third_party/abseil-cpp/absl/numeric/bits.h +68 -2
- data/third_party/abseil-cpp/absl/numeric/int128.cc +0 -52
- data/third_party/abseil-cpp/absl/numeric/internal/bits.h +7 -3
- data/third_party/abseil-cpp/absl/profiling/internal/exponential_biased.cc +1 -1
- data/third_party/abseil-cpp/absl/random/bit_gen_ref.h +10 -11
- data/third_party/abseil-cpp/absl/random/distributions.h +6 -8
- data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +1 -1
- data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +5 -6
- data/third_party/abseil-cpp/absl/random/internal/{pool_urbg.cc → entropy_pool.cc} +22 -90
- data/third_party/abseil-cpp/absl/random/internal/entropy_pool.h +35 -0
- data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +5 -6
- data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +1 -1
- data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +20 -12
- data/third_party/abseil-cpp/absl/random/internal/seed_material.h +5 -5
- data/third_party/abseil-cpp/absl/random/random.h +88 -53
- data/third_party/abseil-cpp/absl/random/seed_sequences.cc +6 -2
- data/third_party/abseil-cpp/absl/status/internal/status_internal.cc +3 -4
- data/third_party/abseil-cpp/absl/status/internal/status_internal.h +3 -4
- data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -3
- data/third_party/abseil-cpp/absl/status/status.cc +4 -8
- data/third_party/abseil-cpp/absl/status/status.h +8 -8
- data/third_party/abseil-cpp/absl/status/status_payload_printer.h +2 -2
- data/third_party/abseil-cpp/absl/status/statusor.cc +2 -2
- data/third_party/abseil-cpp/absl/status/statusor.h +6 -6
- data/third_party/abseil-cpp/absl/strings/ascii.cc +9 -9
- data/third_party/abseil-cpp/absl/strings/ascii.h +18 -18
- data/third_party/abseil-cpp/absl/strings/charconv.cc +21 -22
- data/third_party/abseil-cpp/absl/strings/charconv.h +5 -5
- data/third_party/abseil-cpp/absl/strings/cord.cc +54 -58
- data/third_party/abseil-cpp/absl/strings/cord.h +94 -83
- data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +11 -11
- data/third_party/abseil-cpp/absl/strings/cord_analysis.h +3 -3
- data/third_party/abseil-cpp/absl/strings/escaping.cc +130 -149
- data/third_party/abseil-cpp/absl/strings/escaping.h +9 -10
- data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +6 -8
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +0 -4
- data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +0 -4
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +7 -63
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -11
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +0 -22
- data/third_party/abseil-cpp/absl/strings/internal/str_format/output.cc +5 -3
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
- data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +3 -3
- data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +0 -5
- data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +96 -1
- data/third_party/abseil-cpp/absl/strings/internal/utf8.h +15 -1
- data/third_party/abseil-cpp/absl/strings/numbers.cc +53 -32
- data/third_party/abseil-cpp/absl/strings/numbers.h +87 -58
- data/third_party/abseil-cpp/absl/strings/str_cat.cc +6 -7
- data/third_party/abseil-cpp/absl/strings/str_cat.h +32 -32
- data/third_party/abseil-cpp/absl/strings/str_format.h +18 -18
- data/third_party/abseil-cpp/absl/strings/str_replace.cc +3 -3
- data/third_party/abseil-cpp/absl/strings/str_replace.h +6 -6
- data/third_party/abseil-cpp/absl/strings/string_view.cc +4 -9
- data/third_party/abseil-cpp/absl/strings/string_view.h +27 -32
- data/third_party/abseil-cpp/absl/strings/strip.h +4 -4
- data/third_party/abseil-cpp/absl/strings/substitute.cc +5 -4
- data/third_party/abseil-cpp/absl/strings/substitute.h +66 -64
- data/third_party/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +0 -5
- data/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter_base.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/mutex.cc +1 -1
- data/third_party/abseil-cpp/absl/synchronization/mutex.h +97 -69
- data/third_party/abseil-cpp/absl/synchronization/notification.h +1 -1
- data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -0
- data/third_party/abseil-cpp/absl/time/duration.cc +12 -7
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +1 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +90 -111
- data/third_party/abseil-cpp/absl/time/time.h +20 -15
- data/third_party/abseil-cpp/absl/types/optional.h +7 -747
- data/third_party/abseil-cpp/absl/types/span.h +13 -11
- data/third_party/abseil-cpp/absl/types/variant.h +5 -784
- data/third_party/abseil-cpp/absl/utility/utility.h +10 -185
- metadata +72 -20
- data/src/core/lib/event_engine/forkable.cc +0 -105
- data/src/core/lib/event_engine/forkable.h +0 -67
- data/src/core/lib/iomgr/python_util.h +0 -46
- data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +0 -108
- data/third_party/abseil-cpp/absl/base/internal/invoke.h +0 -241
- data/third_party/abseil-cpp/absl/log/log_entry.cc +0 -41
- data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +0 -131
- data/third_party/abseil-cpp/absl/types/bad_optional_access.cc +0 -66
- data/third_party/abseil-cpp/absl/types/bad_optional_access.h +0 -78
- data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +0 -82
- data/third_party/abseil-cpp/absl/types/bad_variant_access.h +0 -82
- data/third_party/abseil-cpp/absl/types/internal/optional.h +0 -352
- 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
|
-
|
48
|
-
|
49
|
-
|
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
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
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
|
-
//
|
164
|
+
// Represents a node in the channel trace.
|
165
|
+
// Nodes form a tree structure, allowing for hierarchical tracing.
|
72
166
|
//
|
73
|
-
//
|
74
|
-
//
|
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
|
-
//
|
80
|
-
//
|
81
|
-
//
|
82
|
-
|
83
|
-
|
84
|
-
//
|
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
|
-
//
|
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
|
-
//
|
92
|
-
|
93
|
-
|
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,
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
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
|
-
|
116
|
-
|
117
|
-
|
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
|
-
|
305
|
+
static constexpr uint16_t kSentinelId = 65535;
|
128
306
|
|
129
|
-
|
130
|
-
|
131
|
-
|
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
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
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
|
-
|
140
|
-
|
141
|
-
|
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
|
157
|
-
|
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
|
-
|
162
|
-
|
163
|
-
|
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
|