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
@@ -0,0 +1,185 @@
|
|
1
|
+
//
|
2
|
+
//
|
3
|
+
// Copyright 2025 gRPC authors.
|
4
|
+
//
|
5
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
// you may not use this file except in compliance with the License.
|
7
|
+
// You may obtain a copy of the License at
|
8
|
+
//
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
//
|
11
|
+
// Unless required by applicable law or agreed to in writing, software
|
12
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
// See the License for the specific language governing permissions and
|
15
|
+
// limitations under the License.
|
16
|
+
//
|
17
|
+
//
|
18
|
+
|
19
|
+
#ifndef GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_MESSAGE_ASSEMBLER_H
|
20
|
+
#define GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_MESSAGE_ASSEMBLER_H
|
21
|
+
|
22
|
+
#include <cstdint>
|
23
|
+
#include <utility>
|
24
|
+
|
25
|
+
#include "absl/log/check.h"
|
26
|
+
#include "src/core/call/message.h"
|
27
|
+
#include "src/core/ext/transport/chttp2/transport/frame.h"
|
28
|
+
#include "src/core/ext/transport/chttp2/transport/http2_status.h"
|
29
|
+
#include "src/core/lib/resource_quota/arena.h"
|
30
|
+
#include "src/core/lib/slice/slice.h"
|
31
|
+
#include "src/core/lib/slice/slice_buffer.h"
|
32
|
+
#include "src/core/util/ref_counted_ptr.h"
|
33
|
+
|
34
|
+
namespace grpc_core {
|
35
|
+
namespace http2 {
|
36
|
+
|
37
|
+
// TODO(tjagtap) TODO(akshitpatel): [PH2][P3] : Write micro benchmarks for
|
38
|
+
// assembler and disassembler code
|
39
|
+
|
40
|
+
constexpr uint32_t kOneGb = (1024u * 1024u * 1024u);
|
41
|
+
|
42
|
+
// For the mapping of gRPC Messages to Http2DataFrame, we can have
|
43
|
+
// 1. One gRPC Message in one Http2DataFrame
|
44
|
+
// 2. Many gRPC Messages in one Http2DataFrame
|
45
|
+
// 3. One gRPC Message spread across multiple consecutive Http2DataFrames
|
46
|
+
// 4. An Http2DataFrame could also hold multiple gRPC Messages with the first
|
47
|
+
// and last gRPC Messages being partial messages.
|
48
|
+
// This class helps to assemble gRPC Messages from a series of Http2DataFrame
|
49
|
+
// payloads by processing the payloads one at a time.
|
50
|
+
class GrpcMessageAssembler {
|
51
|
+
public:
|
52
|
+
// Input : The input must contain the payload from the Http2DataFrame.
|
53
|
+
// This function will move the payload into an internal buffer.
|
54
|
+
Http2Status AppendNewDataFrame(SliceBuffer& payload,
|
55
|
+
const bool is_end_stream) {
|
56
|
+
DCHECK(!is_end_stream_)
|
57
|
+
<< "Calling this function when a previous frame was marked as the last "
|
58
|
+
"frame does not make sense.";
|
59
|
+
is_end_stream_ = is_end_stream;
|
60
|
+
if constexpr (sizeof(size_t) == 4) {
|
61
|
+
if (GPR_UNLIKELY(message_buffer_.Length() >=
|
62
|
+
UINT32_MAX - payload.Length())) {
|
63
|
+
return Http2Status::Http2StreamError(
|
64
|
+
Http2ErrorCode::kInternalError,
|
65
|
+
"Stream Error: SliceBuffer overflow for 32 bit platforms.");
|
66
|
+
}
|
67
|
+
}
|
68
|
+
payload.MoveFirstNBytesIntoSliceBuffer(payload.Length(), message_buffer_);
|
69
|
+
DCHECK_EQ(payload.Length(), 0u);
|
70
|
+
return Http2Status::Ok();
|
71
|
+
}
|
72
|
+
|
73
|
+
// Returns a valid MessageHandle if it has a complete message.
|
74
|
+
// Returns a nullptr if it does not have a complete message.
|
75
|
+
// Returns an error if an incomplete message is received and the stream ends.
|
76
|
+
ValueOrHttp2Status<MessageHandle> ExtractMessage() {
|
77
|
+
const size_t current_len = message_buffer_.Length();
|
78
|
+
if (current_len < kGrpcHeaderSizeInBytes) {
|
79
|
+
// TODO(tjagtap) : [PH2][P3] : Write a test for this failure.
|
80
|
+
LOG(ERROR) << "Incomplete gRPC message received";
|
81
|
+
return ReturnNullOrError();
|
82
|
+
}
|
83
|
+
GrpcMessageHeader header = ExtractGrpcHeader(message_buffer_);
|
84
|
+
if constexpr (sizeof(size_t) == 4) {
|
85
|
+
if (GPR_UNLIKELY(header.length > kOneGb)) {
|
86
|
+
return Http2Status::Http2StreamError(
|
87
|
+
Http2ErrorCode::kInternalError,
|
88
|
+
"Stream Error: SliceBuffer overflow for 32 bit platforms.");
|
89
|
+
}
|
90
|
+
}
|
91
|
+
if (GPR_LIKELY(current_len - kGrpcHeaderSizeInBytes >= header.length)) {
|
92
|
+
SliceBuffer discard;
|
93
|
+
message_buffer_.MoveFirstNBytesIntoSliceBuffer(kGrpcHeaderSizeInBytes,
|
94
|
+
discard);
|
95
|
+
discard.Clear();
|
96
|
+
// If gRPC header has length 0, we return an empty message.
|
97
|
+
// Bounds: Max len of a valid gRPC message is 4 GB in gRPC C++. 2GB for
|
98
|
+
// other stacks. Since 4 bytes can hold length of 4GB, we dont check
|
99
|
+
// bounds.
|
100
|
+
MessageHandle grpc_message = Arena::MakePooled<Message>();
|
101
|
+
message_buffer_.MoveFirstNBytesIntoSliceBuffer(
|
102
|
+
header.length, *(grpc_message->payload()));
|
103
|
+
uint32_t& flag = grpc_message->mutable_flags();
|
104
|
+
flag = header.flags;
|
105
|
+
return std::move(grpc_message);
|
106
|
+
}
|
107
|
+
return ReturnNullOrError();
|
108
|
+
}
|
109
|
+
|
110
|
+
private:
|
111
|
+
ValueOrHttp2Status<MessageHandle> ReturnNullOrError() {
|
112
|
+
if (GPR_UNLIKELY(is_end_stream_ && message_buffer_.Length() > 0)) {
|
113
|
+
return Http2Status::Http2StreamError(Http2ErrorCode::kInternalError,
|
114
|
+
"Incomplete gRPC frame received");
|
115
|
+
}
|
116
|
+
return ValueOrHttp2Status<MessageHandle>(nullptr);
|
117
|
+
}
|
118
|
+
bool is_end_stream_ = false;
|
119
|
+
SliceBuffer message_buffer_;
|
120
|
+
};
|
121
|
+
|
122
|
+
constexpr uint32_t kMaxMessageBatchSize = (16 * 1024u);
|
123
|
+
|
124
|
+
// This class is meant to convert gRPC Messages into Http2DataFrame ensuring
|
125
|
+
// that the payload size of the data frame is configurable.
|
126
|
+
// This class is not responsible for queueing or backpressure. That will be done
|
127
|
+
// by other classes.
|
128
|
+
// TODO(tjagtap) : [PH2][P2] Edit comment once this
|
129
|
+
// class is integrated and exercised.
|
130
|
+
class GrpcMessageDisassembler {
|
131
|
+
public:
|
132
|
+
// One GrpcMessageDisassembler instance MUST be associated with one stream
|
133
|
+
// for its lifetime.
|
134
|
+
GrpcMessageDisassembler() = default;
|
135
|
+
|
136
|
+
// GrpcMessageDisassembler object will take ownership of the message.
|
137
|
+
void PrepareSingleMessageForSending(MessageHandle message) {
|
138
|
+
DCHECK_EQ(GetBufferedLength(), 0u);
|
139
|
+
PrepareMessageForSending(std::move(message));
|
140
|
+
}
|
141
|
+
|
142
|
+
// GrpcMessageDisassembler object will take ownership of the message.
|
143
|
+
void PrepareBatchedMessageForSending(MessageHandle message) {
|
144
|
+
PrepareMessageForSending(std::move(message));
|
145
|
+
DCHECK_LE(GetBufferedLength(), kMaxMessageBatchSize)
|
146
|
+
<< "Avoid batches larger than " << kMaxMessageBatchSize << "bytes";
|
147
|
+
}
|
148
|
+
|
149
|
+
size_t GetBufferedLength() const { return message_.Length(); }
|
150
|
+
|
151
|
+
// Gets the next Http2DataFrame with a payload of size max_length or lesser.
|
152
|
+
Http2DataFrame GenerateNextFrame(const uint32_t stream_id,
|
153
|
+
const uint32_t max_length,
|
154
|
+
const bool is_end_stream = false) {
|
155
|
+
DCHECK_GT(max_length, 0u);
|
156
|
+
DCHECK_GT(GetBufferedLength(), 0u);
|
157
|
+
SliceBuffer temp;
|
158
|
+
const uint32_t current_length =
|
159
|
+
message_.Length() >= max_length ? max_length : message_.Length();
|
160
|
+
message_.MoveFirstNBytesIntoSliceBuffer(current_length, temp);
|
161
|
+
return Http2DataFrame{stream_id, is_end_stream, std::move(temp)};
|
162
|
+
}
|
163
|
+
|
164
|
+
Http2DataFrame GenerateEmptyEndFrame(const uint32_t stream_id) {
|
165
|
+
// RFC9113 : Frames with zero length with the END_STREAM flag set (that is,
|
166
|
+
// an empty DATA frame) MAY be sent if there is no available space in either
|
167
|
+
// flow-control window.
|
168
|
+
SliceBuffer temp;
|
169
|
+
return Http2DataFrame{stream_id, /*end_stream=*/true, std::move(temp)};
|
170
|
+
}
|
171
|
+
|
172
|
+
private:
|
173
|
+
void PrepareMessageForSending(MessageHandle message) {
|
174
|
+
AppendGrpcHeaderToSliceBuffer(message_, message->flags(),
|
175
|
+
message->payload()->Length());
|
176
|
+
message_.Append(*(message->payload()));
|
177
|
+
}
|
178
|
+
|
179
|
+
SliceBuffer message_;
|
180
|
+
};
|
181
|
+
|
182
|
+
} // namespace http2
|
183
|
+
} // namespace grpc_core
|
184
|
+
|
185
|
+
#endif // GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_MESSAGE_ASSEMBLER_H
|
@@ -545,8 +545,7 @@ void grpc_chttp2_parsing_become_skip_parser(grpc_chttp2_transport* t) {
|
|
545
545
|
static grpc_error_handle init_data_frame_parser(grpc_chttp2_transport* t) {
|
546
546
|
// Update BDP accounting since we have received a data frame.
|
547
547
|
grpc_core::BdpEstimator* bdp_est = t->flow_control.bdp_estimator();
|
548
|
-
|
549
|
-
t->incoming_frame_size);
|
548
|
+
t->http2_stats->IncrementHttp2ReadDataFrameSize(t->incoming_frame_size);
|
550
549
|
if (bdp_est) {
|
551
550
|
if (t->bdp_ping_blocked) {
|
552
551
|
t->bdp_ping_blocked = false;
|
@@ -671,8 +670,7 @@ static grpc_error_handle init_header_frame_parser(grpc_chttp2_transport* t,
|
|
671
670
|
nullptr, &t->http2_ztrace_collector));
|
672
671
|
grpc_chttp2_initiate_write(t, GRPC_CHTTP2_INITIATE_WRITE_RST_STREAM);
|
673
672
|
return init_header_skip_frame_parser(t, priority_type, is_eoh);
|
674
|
-
} else if (
|
675
|
-
GPR_UNLIKELY(t->memory_owner.IsMemoryPressureHigh())) {
|
673
|
+
} else if (GPR_UNLIKELY(t->memory_owner.IsMemoryPressureHigh())) {
|
676
674
|
// We have more streams allocated than we'd like, so apply some pushback
|
677
675
|
// by refusing this stream.
|
678
676
|
grpc_core::global_stats().IncrementRqCallsRejected();
|
@@ -28,6 +28,7 @@
|
|
28
28
|
#include "absl/functional/any_invocable.h"
|
29
29
|
#include "absl/hash/hash.h"
|
30
30
|
#include "absl/random/bit_gen_ref.h"
|
31
|
+
#include "src/core/channelz/property_list.h"
|
31
32
|
#include "src/core/lib/debug/trace.h"
|
32
33
|
#include "src/core/util/time.h"
|
33
34
|
|
@@ -90,6 +91,24 @@ class Chttp2PingCallbacks {
|
|
90
91
|
grpc_event_engine::experimental::EventEngine* event_engine,
|
91
92
|
Callback callback);
|
92
93
|
|
94
|
+
channelz::PropertyList ChannelzProperties() const {
|
95
|
+
return channelz::PropertyList()
|
96
|
+
.Set("ping_requested", ping_requested_)
|
97
|
+
.Set("most_recent_inflight", most_recent_inflight_)
|
98
|
+
.Set("started_new_ping_without_setting_timeout",
|
99
|
+
started_new_ping_without_setting_timeout_)
|
100
|
+
.Set("inflight",
|
101
|
+
[this]() {
|
102
|
+
channelz::PropertyTable inflight;
|
103
|
+
for (const auto& [id, ping] : inflight_) {
|
104
|
+
inflight.AppendRow(channelz::PropertyList().Set("id", id));
|
105
|
+
}
|
106
|
+
return inflight;
|
107
|
+
}())
|
108
|
+
.Set("num_on_start", on_start_.size())
|
109
|
+
.Set("num_on_ack", on_ack_.size());
|
110
|
+
}
|
111
|
+
|
93
112
|
private:
|
94
113
|
using CallbackVec = std::vector<Callback>;
|
95
114
|
struct InflightPing {
|
@@ -0,0 +1,151 @@
|
|
1
|
+
//
|
2
|
+
//
|
3
|
+
// Copyright 2025 gRPC authors.
|
4
|
+
//
|
5
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
// you may not use this file except in compliance with the License.
|
7
|
+
// You may obtain a copy of the License at
|
8
|
+
//
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
//
|
11
|
+
// Unless required by applicable law or agreed to in writing, software
|
12
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
// See the License for the specific language governing permissions and
|
15
|
+
// limitations under the License.
|
16
|
+
//
|
17
|
+
//
|
18
|
+
#include "src/core/ext/transport/chttp2/transport/ping_promise.h"
|
19
|
+
|
20
|
+
#include "src/core/lib/promise/if.h"
|
21
|
+
#include "src/core/lib/promise/latch.h"
|
22
|
+
#include "src/core/lib/promise/map.h"
|
23
|
+
#include "src/core/lib/promise/party.h"
|
24
|
+
#include "src/core/lib/promise/race.h"
|
25
|
+
#include "src/core/lib/promise/sleep.h"
|
26
|
+
#include "src/core/lib/promise/try_seq.h"
|
27
|
+
#include "src/core/util/match.h"
|
28
|
+
#include "src/core/util/time.h"
|
29
|
+
|
30
|
+
namespace grpc_core {
|
31
|
+
namespace http2 {
|
32
|
+
using SendPingArgs = ::grpc_core::http2::PingInterface::SendPingArgs;
|
33
|
+
using Callback = absl::AnyInvocable<void()>;
|
34
|
+
using grpc_event_engine::experimental::EventEngine;
|
35
|
+
|
36
|
+
#define GRPC_HTTP2_PING_LOG \
|
37
|
+
LOG_IF(INFO, (GRPC_TRACE_FLAG_ENABLED(http) || \
|
38
|
+
GRPC_TRACE_FLAG_ENABLED(bdp_estimator) || \
|
39
|
+
GRPC_TRACE_FLAG_ENABLED(http_keepalive) || \
|
40
|
+
GRPC_TRACE_FLAG_ENABLED(http2_ping)))
|
41
|
+
|
42
|
+
Promise<absl::Status> PingManager::PingPromiseCallbacks::RequestPing(
|
43
|
+
Callback on_initiate) {
|
44
|
+
std::shared_ptr<Latch<void>> latch = std::make_shared<Latch<void>>();
|
45
|
+
auto on_ack = [latch]() { latch->Set(); };
|
46
|
+
ping_callbacks_.OnPing(std::move(on_initiate), std::move(on_ack));
|
47
|
+
return Map(latch->Wait(), [latch](Empty) { return absl::OkStatus(); });
|
48
|
+
}
|
49
|
+
|
50
|
+
Promise<absl::Status> PingManager::PingPromiseCallbacks::WaitForPingAck() {
|
51
|
+
std::shared_ptr<Latch<void>> latch = std::make_shared<Latch<void>>();
|
52
|
+
auto on_ack = [latch]() { latch->Set(); };
|
53
|
+
ping_callbacks_.OnPingAck(std::move(on_ack));
|
54
|
+
return Map(latch->Wait(), [latch](Empty) { return absl::OkStatus(); });
|
55
|
+
}
|
56
|
+
|
57
|
+
// Ping System implementation
|
58
|
+
PingManager::PingManager(const ChannelArgs& channel_args,
|
59
|
+
std::unique_ptr<PingInterface> ping_interface,
|
60
|
+
std::shared_ptr<EventEngine> event_engine)
|
61
|
+
: ping_callbacks_(event_engine),
|
62
|
+
ping_abuse_policy_(channel_args),
|
63
|
+
ping_rate_policy_(channel_args, /*is_client=*/true),
|
64
|
+
ping_interface_(std::move(ping_interface)) {}
|
65
|
+
|
66
|
+
void PingManager::TriggerDelayedPing(Duration wait) {
|
67
|
+
// Spawn at most once.
|
68
|
+
if (delayed_ping_spawned_) {
|
69
|
+
return;
|
70
|
+
}
|
71
|
+
delayed_ping_spawned_ = true;
|
72
|
+
GetContext<Party>()->Spawn(
|
73
|
+
"DelayedPing",
|
74
|
+
[this, wait]() mutable {
|
75
|
+
VLOG(2) << "Scheduling delayed ping after wait=" << wait;
|
76
|
+
return AssertResultType<absl::Status>(TrySeq(
|
77
|
+
Sleep(wait),
|
78
|
+
[this]() mutable { return ping_interface_->TriggerWrite(); }));
|
79
|
+
},
|
80
|
+
[this](auto) { delayed_ping_spawned_ = false; });
|
81
|
+
}
|
82
|
+
|
83
|
+
bool PingManager::NeedToPing(Duration next_allowed_ping_interval) {
|
84
|
+
if (!ping_callbacks_.PingRequested()) {
|
85
|
+
return false;
|
86
|
+
}
|
87
|
+
|
88
|
+
return Match(
|
89
|
+
ping_rate_policy_.RequestSendPing(next_allowed_ping_interval,
|
90
|
+
ping_callbacks_.CountPingInflight()),
|
91
|
+
[this](Chttp2PingRatePolicy::SendGranted) {
|
92
|
+
// TODO(akshitpatel) : [PH2][P1] : Update some keepalive flags.
|
93
|
+
GRPC_HTTP2_PING_LOG << "CLIENT" << "[" << "PH2"
|
94
|
+
<< "]: Ping sent"
|
95
|
+
<< ping_rate_policy_.GetDebugString();
|
96
|
+
return true;
|
97
|
+
},
|
98
|
+
[this](Chttp2PingRatePolicy::TooManyRecentPings) {
|
99
|
+
GRPC_HTTP2_PING_LOG << "CLIENT" << "[" << "PH2"
|
100
|
+
<< "]: Ping delayed too many recent pings: "
|
101
|
+
<< ping_rate_policy_.GetDebugString();
|
102
|
+
return false;
|
103
|
+
},
|
104
|
+
[this](Chttp2PingRatePolicy::TooSoon too_soon) mutable {
|
105
|
+
GRPC_HTTP2_PING_LOG
|
106
|
+
<< "]: Ping delayed not enough time elapsed since last "
|
107
|
+
"ping. Last ping:"
|
108
|
+
<< too_soon.last_ping
|
109
|
+
<< ", minimum wait:" << too_soon.next_allowed_ping_interval
|
110
|
+
<< ", need to wait:" << too_soon.wait;
|
111
|
+
TriggerDelayedPing(too_soon.wait);
|
112
|
+
return false;
|
113
|
+
});
|
114
|
+
}
|
115
|
+
|
116
|
+
void PingManager::SpawnTimeout(Duration ping_timeout,
|
117
|
+
const uint64_t opaque_data) {
|
118
|
+
GetContext<Party>()->Spawn(
|
119
|
+
"PingTimeout",
|
120
|
+
[this, ping_timeout, opaque_data]() {
|
121
|
+
return AssertResultType<absl::Status>(Race(
|
122
|
+
TrySeq(ping_callbacks_.PingTimeout(ping_timeout),
|
123
|
+
[this, opaque_data]() mutable {
|
124
|
+
VLOG(2) << " Ping ack not received for id=" << opaque_data
|
125
|
+
<< ". Ping timeout triggered.";
|
126
|
+
return ping_interface_->PingTimeout();
|
127
|
+
}),
|
128
|
+
ping_callbacks_.WaitForPingAck()));
|
129
|
+
},
|
130
|
+
[](auto) {});
|
131
|
+
}
|
132
|
+
|
133
|
+
Promise<absl::Status> PingManager::MaybeSendPing(
|
134
|
+
Duration next_allowed_ping_interval, Duration ping_timeout) {
|
135
|
+
return If(
|
136
|
+
NeedToPing(next_allowed_ping_interval),
|
137
|
+
[this, ping_timeout]() mutable {
|
138
|
+
const uint64_t opaque_data = ping_callbacks_.StartPing();
|
139
|
+
return AssertResultType<absl::Status>(
|
140
|
+
TrySeq(ping_interface_->SendPing(SendPingArgs{false, opaque_data}),
|
141
|
+
[this, ping_timeout, opaque_data]() {
|
142
|
+
VLOG(2) << "Ping Sent with id: " << opaque_data;
|
143
|
+
SpawnTimeout(ping_timeout, opaque_data);
|
144
|
+
SentPing();
|
145
|
+
return absl::OkStatus();
|
146
|
+
}));
|
147
|
+
},
|
148
|
+
[]() { return Immediate(absl::OkStatus()); });
|
149
|
+
}
|
150
|
+
} // namespace http2
|
151
|
+
} // namespace grpc_core
|
@@ -0,0 +1,180 @@
|
|
1
|
+
//
|
2
|
+
//
|
3
|
+
// Copyright 2025 gRPC authors.
|
4
|
+
//
|
5
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
// you may not use this file except in compliance with the License.
|
7
|
+
// You may obtain a copy of the License at
|
8
|
+
//
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
//
|
11
|
+
// Unless required by applicable law or agreed to in writing, software
|
12
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
// See the License for the specific language governing permissions and
|
15
|
+
// limitations under the License.
|
16
|
+
//
|
17
|
+
//
|
18
|
+
#ifndef GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_PING_PROMISE_H
|
19
|
+
#define GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_PING_PROMISE_H
|
20
|
+
|
21
|
+
#include <memory>
|
22
|
+
|
23
|
+
#include "src/core/ext/transport/chttp2/transport/ping_abuse_policy.h"
|
24
|
+
#include "src/core/ext/transport/chttp2/transport/ping_callbacks.h"
|
25
|
+
#include "src/core/ext/transport/chttp2/transport/ping_rate_policy.h"
|
26
|
+
#include "src/core/lib/promise/inter_activity_latch.h"
|
27
|
+
#include "src/core/lib/promise/map.h"
|
28
|
+
#include "src/core/lib/promise/promise.h"
|
29
|
+
#include "src/core/util/shared_bit_gen.h"
|
30
|
+
#include "src/core/util/time.h"
|
31
|
+
|
32
|
+
namespace grpc_core {
|
33
|
+
namespace http2 {
|
34
|
+
|
35
|
+
// Ping Promise Spawns Overview
|
36
|
+
|
37
|
+
// | Promise Spawn | Max Duration | Promise | Max Spawns |
|
38
|
+
// | | for Spawn | Resolution | |
|
39
|
+
// |-----------------|--------------|--------------|-------------------------|
|
40
|
+
// | Ping Timeout | 1 minute | On Ping ack | One per inflight ping |
|
41
|
+
// | | | or timeout | |
|
42
|
+
// | Delayed Ping | 2 Hours | On scheduled | One |
|
43
|
+
// | | | time | |
|
44
|
+
// | Ping Waiter | 1 minute | On Ping ack | One per ping request |
|
45
|
+
// | | | or timeout | |
|
46
|
+
// Max Party Slots:
|
47
|
+
// - Without multi ping:
|
48
|
+
// - 1 per ping request + 1 (for delayed ping) + 1 (for ping timeout)
|
49
|
+
// - Worst case(3 ping requests): 5
|
50
|
+
|
51
|
+
// - With multi ping:
|
52
|
+
// - 1 per ping request + 1 (for delayed ping) + 1 per inflight ping
|
53
|
+
// (for ping timeout)
|
54
|
+
// - Worst case(3 ping requests): 7
|
55
|
+
|
56
|
+
class PingInterface {
|
57
|
+
public:
|
58
|
+
struct SendPingArgs {
|
59
|
+
bool ack = false;
|
60
|
+
// RFC9113: PING frames MUST contain 8 octets of opaque data in the frame
|
61
|
+
// payload. A sender can include any value it chooses and use those octets
|
62
|
+
// in any fashion.
|
63
|
+
uint64_t opaque_data = 0;
|
64
|
+
};
|
65
|
+
|
66
|
+
// Returns a promise that creates and sends a ping frame to the peer.
|
67
|
+
virtual Promise<absl::Status> SendPing(SendPingArgs args) = 0;
|
68
|
+
|
69
|
+
// Returns a promise that triggers a write cycle on the transport.
|
70
|
+
virtual Promise<absl::Status> TriggerWrite() = 0;
|
71
|
+
|
72
|
+
// Returns a promise that handles the ping timeout.
|
73
|
+
virtual Promise<absl::Status> PingTimeout() = 0;
|
74
|
+
virtual ~PingInterface() = default;
|
75
|
+
};
|
76
|
+
|
77
|
+
// The code in this class is NOT thread safe. It has been designed to run on a
|
78
|
+
// single thread. This guarantee is achieved by spawning all the promises
|
79
|
+
// returned by this class on the same transport party.
|
80
|
+
class PingManager {
|
81
|
+
public:
|
82
|
+
PingManager(const ChannelArgs& channel_args,
|
83
|
+
std::unique_ptr<PingInterface> ping_interface,
|
84
|
+
std::shared_ptr<grpc_event_engine::experimental::EventEngine>
|
85
|
+
event_engine);
|
86
|
+
|
87
|
+
// Returns a promise that determines if a ping frame should be sent to the
|
88
|
+
// peer. If a ping frame is sent, it also spawns a timeout promise that
|
89
|
+
// handles the ping timeout.
|
90
|
+
Promise<absl::Status> MaybeSendPing(Duration next_allowed_ping_interval,
|
91
|
+
Duration ping_timeout);
|
92
|
+
|
93
|
+
// Ping Rate policy wrapper
|
94
|
+
void ReceivedDataFrame() { ping_rate_policy_.ReceivedDataFrame(); }
|
95
|
+
|
96
|
+
// Ping abuse policy wrapper
|
97
|
+
bool NotifyPingAbusePolicy(const bool transport_idle) {
|
98
|
+
return ping_abuse_policy_.ReceivedOnePing(transport_idle);
|
99
|
+
}
|
100
|
+
|
101
|
+
void ResetPingClock(bool is_client) {
|
102
|
+
if (!is_client) {
|
103
|
+
ping_abuse_policy_.ResetPingStrikes();
|
104
|
+
}
|
105
|
+
ping_rate_policy_.ResetPingsBeforeDataRequired();
|
106
|
+
}
|
107
|
+
|
108
|
+
// Ping callbacks wrapper
|
109
|
+
|
110
|
+
// Returns a promise that resolves once a new ping is initiated and ack is
|
111
|
+
// received for the same. The on_initiate callback is executed when the
|
112
|
+
// ping is initiated.
|
113
|
+
auto RequestPing(absl::AnyInvocable<void()> on_initiate) {
|
114
|
+
return ping_callbacks_.RequestPing(std::move(on_initiate));
|
115
|
+
}
|
116
|
+
|
117
|
+
// Returns a promise that resolves once the next valid ping ack is received.
|
118
|
+
auto WaitForPingAck() { return ping_callbacks_.WaitForPingAck(); }
|
119
|
+
|
120
|
+
// Cancels all the callbacks for the inflight pings. This function does not
|
121
|
+
// cancel the promises that are waiting on the ping ack.
|
122
|
+
// This should be called as part of closing the transport to free up any
|
123
|
+
// memory in use by the ping callbacks.
|
124
|
+
void CancelCallbacks() { ping_callbacks_.CancelCallbacks(); }
|
125
|
+
|
126
|
+
uint64_t StartPing() { return ping_callbacks_.StartPing(); }
|
127
|
+
bool PingRequested() { return ping_callbacks_.PingRequested(); }
|
128
|
+
bool AckPing(uint64_t id) { return ping_callbacks_.AckPing(id); }
|
129
|
+
size_t CountPingInflight() { return ping_callbacks_.CountPingInflight(); }
|
130
|
+
|
131
|
+
private:
|
132
|
+
class PingPromiseCallbacks {
|
133
|
+
public:
|
134
|
+
explicit PingPromiseCallbacks(
|
135
|
+
std::shared_ptr<grpc_event_engine::experimental::EventEngine>
|
136
|
+
event_engine)
|
137
|
+
: event_engine_(event_engine) {}
|
138
|
+
Promise<absl::Status> RequestPing(absl::AnyInvocable<void()> on_initiate);
|
139
|
+
Promise<absl::Status> WaitForPingAck();
|
140
|
+
void CancelCallbacks() { ping_callbacks_.CancelAll(event_engine_.get()); }
|
141
|
+
uint64_t StartPing() { return ping_callbacks_.StartPing(SharedBitGen()); }
|
142
|
+
bool PingRequested() { return ping_callbacks_.ping_requested(); }
|
143
|
+
bool AckPing(uint64_t id) {
|
144
|
+
return ping_callbacks_.AckPing(id, event_engine_.get());
|
145
|
+
}
|
146
|
+
size_t CountPingInflight() { return ping_callbacks_.pings_inflight(); }
|
147
|
+
|
148
|
+
auto PingTimeout(Duration ping_timeout) {
|
149
|
+
std::shared_ptr<InterActivityLatch<void>> latch =
|
150
|
+
std::make_shared<InterActivityLatch<void>>();
|
151
|
+
auto timeout_cb = [latch]() { latch->Set(); };
|
152
|
+
auto id = ping_callbacks_.OnPingTimeout(ping_timeout, event_engine_.get(),
|
153
|
+
std::move(timeout_cb));
|
154
|
+
DCHECK(id.has_value());
|
155
|
+
VLOG(2) << "Ping timeout of duration: " << ping_timeout
|
156
|
+
<< " initiated for ping id: " << *id;
|
157
|
+
return Map(latch->Wait(), [latch](Empty) { return absl::OkStatus(); });
|
158
|
+
}
|
159
|
+
|
160
|
+
private:
|
161
|
+
Chttp2PingCallbacks ping_callbacks_;
|
162
|
+
std::shared_ptr<grpc_event_engine::experimental::EventEngine> event_engine_;
|
163
|
+
};
|
164
|
+
|
165
|
+
PingPromiseCallbacks ping_callbacks_;
|
166
|
+
Chttp2PingAbusePolicy ping_abuse_policy_;
|
167
|
+
Chttp2PingRatePolicy ping_rate_policy_;
|
168
|
+
bool delayed_ping_spawned_ = false;
|
169
|
+
std::unique_ptr<PingInterface> ping_interface_;
|
170
|
+
|
171
|
+
void TriggerDelayedPing(Duration wait);
|
172
|
+
bool NeedToPing(Duration next_allowed_ping_interval);
|
173
|
+
void SpawnTimeout(Duration ping_timeout, uint64_t opaque_data);
|
174
|
+
|
175
|
+
void SentPing() { ping_rate_policy_.SentPing(); }
|
176
|
+
};
|
177
|
+
} // namespace http2
|
178
|
+
} // namespace grpc_core
|
179
|
+
|
180
|
+
#endif // GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_PING_PROMISE_H
|
@@ -79,15 +79,11 @@ Chttp2PingRatePolicy::RequestSendPing(Duration next_allowed_ping_interval,
|
|
79
79
|
// Throttle pings to 1 minute if we haven't sent any data recently
|
80
80
|
if (max_pings_without_data_sent_ != 0 &&
|
81
81
|
pings_before_data_sending_required_ == 0) {
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
next_allowed_ping - now};
|
88
|
-
}
|
89
|
-
} else {
|
90
|
-
return TooManyRecentPings{};
|
82
|
+
const Timestamp next_allowed_ping =
|
83
|
+
last_ping_sent_time_ + kThrottleIntervalWithoutDataSent;
|
84
|
+
if (next_allowed_ping > now) {
|
85
|
+
return TooSoon{kThrottleIntervalWithoutDataSent, last_ping_sent_time_,
|
86
|
+
next_allowed_ping - now};
|
91
87
|
}
|
92
88
|
}
|
93
89
|
|
@@ -22,7 +22,9 @@
|
|
22
22
|
#include <string>
|
23
23
|
#include <variant>
|
24
24
|
|
25
|
+
#include "src/core/channelz/property_list.h"
|
25
26
|
#include "src/core/lib/channel/channel_args.h"
|
27
|
+
#include "src/core/util/string.h"
|
26
28
|
#include "src/core/util/time.h"
|
27
29
|
|
28
30
|
namespace grpc_core {
|
@@ -78,6 +80,15 @@ class Chttp2PingRatePolicy {
|
|
78
80
|
return max_pings_without_data_sent_;
|
79
81
|
}
|
80
82
|
|
83
|
+
channelz::PropertyList ChannelzProperties() const {
|
84
|
+
return channelz::PropertyList()
|
85
|
+
.Set("max_pings_without_data_sent", max_pings_without_data_sent_)
|
86
|
+
.Set("max_inflight_pings", max_inflight_pings_)
|
87
|
+
.Set("pings_before_data_sending_required",
|
88
|
+
pings_before_data_sending_required_)
|
89
|
+
.Set("last_ping_sent_time", last_ping_sent_time_);
|
90
|
+
}
|
91
|
+
|
81
92
|
private:
|
82
93
|
const int max_pings_without_data_sent_;
|
83
94
|
const int max_inflight_pings_;
|