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
@@ -32,6 +32,7 @@
|
|
32
32
|
#include "absl/log/check.h"
|
33
33
|
#include "absl/status/status.h"
|
34
34
|
#include "absl/strings/string_view.h"
|
35
|
+
#include "src/core/channelz/property_list.h"
|
35
36
|
#include "src/core/ext/transport/chttp2/transport/http2_settings.h"
|
36
37
|
#include "src/core/lib/debug/trace.h"
|
37
38
|
#include "src/core/lib/resource_quota/memory_quota.h"
|
@@ -271,6 +272,11 @@ class TransportFlowControl final {
|
|
271
272
|
|
272
273
|
FlowControlAction SetAckedInitialWindow(uint32_t value);
|
273
274
|
|
275
|
+
void set_target_initial_window_size(uint32_t value) {
|
276
|
+
target_initial_window_size_ =
|
277
|
+
std::min(value, Http2Settings::max_initial_window_size());
|
278
|
+
}
|
279
|
+
|
274
280
|
// Getters
|
275
281
|
int64_t remote_window() const { return remote_window_; }
|
276
282
|
int64_t announced_window() const { return announced_window_; }
|
@@ -302,23 +308,22 @@ class TransportFlowControl final {
|
|
302
308
|
double bdp_bw_est;
|
303
309
|
|
304
310
|
std::string ToString() const;
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
return object;
|
311
|
+
channelz::PropertyList ChannelzProperties() const {
|
312
|
+
return channelz::PropertyList()
|
313
|
+
.Set("target_window", target_window)
|
314
|
+
.Set("target_frame_size", target_frame_size)
|
315
|
+
.Set("target_preferred_rx_crypto_frame_size",
|
316
|
+
target_preferred_rx_crypto_frame_size)
|
317
|
+
.Set("acked_init_window", acked_init_window)
|
318
|
+
.Set("queued_init_window", queued_init_window)
|
319
|
+
.Set("sent_init_window", sent_init_window)
|
320
|
+
.Set("remote_window", remote_window)
|
321
|
+
.Set("announced_window", announced_window)
|
322
|
+
.Set("announced_stream_total_over_incoming_window",
|
323
|
+
announced_stream_total_over_incoming_window)
|
324
|
+
.Set("bdp_accumulator", bdp_accumulator)
|
325
|
+
.Set("bdp_estimate", bdp_estimate)
|
326
|
+
.Set("bdp_bw_est", bdp_bw_est);
|
322
327
|
}
|
323
328
|
};
|
324
329
|
|
@@ -632,6 +632,16 @@ http2::ValueOrHttp2Status<Http2Frame> ParseFramePayload(
|
|
632
632
|
}
|
633
633
|
}
|
634
634
|
|
635
|
+
http2::Http2ErrorCode Http2ErrorCodeFromRstFrameErrorCode(uint32_t error_code) {
|
636
|
+
if (GPR_UNLIKELY(error_code > http2::GetMaxHttp2ErrorCode())) {
|
637
|
+
LOG(ERROR) << "Http2ErrorCodeFromRstFrameErrorCode: Invalid error code "
|
638
|
+
"received from RST_STREAM frame: "
|
639
|
+
<< error_code;
|
640
|
+
return http2::Http2ErrorCode::kInternalError;
|
641
|
+
}
|
642
|
+
return static_cast<http2::Http2ErrorCode>(error_code);
|
643
|
+
}
|
644
|
+
|
635
645
|
GrpcMessageHeader ExtractGrpcHeader(SliceBuffer& payload) {
|
636
646
|
CHECK_GE(payload.Length(), kGrpcHeaderSizeInBytes);
|
637
647
|
uint8_t buffer[kGrpcHeaderSizeInBytes];
|
@@ -237,6 +237,8 @@ http2::ValueOrHttp2Status<Http2Frame> ParseFramePayload(
|
|
237
237
|
// move things out of frames)
|
238
238
|
void Serialize(absl::Span<Http2Frame> frames, SliceBuffer& out);
|
239
239
|
|
240
|
+
http2::Http2ErrorCode Http2ErrorCodeFromRstFrameErrorCode(uint32_t error_code);
|
241
|
+
|
240
242
|
///////////////////////////////////////////////////////////////////////////////
|
241
243
|
// GRPC Header
|
242
244
|
|
@@ -321,8 +323,6 @@ inline constexpr absl::string_view kGoAwayLength8 =
|
|
321
323
|
"GOAWAY frame should have a Last-Stream-ID and Error Code making the "
|
322
324
|
"minimum length 8 octets";
|
323
325
|
|
324
|
-
// TODO(tjagtap) : [PH2][P2] : Take care that our transport class does not make
|
325
|
-
// stream id larger than this.
|
326
326
|
inline constexpr uint32_t kMaxStreamId31Bit = 0x7fffffffu;
|
327
327
|
|
328
328
|
} // namespace RFC9113
|
@@ -80,7 +80,7 @@ void grpc_chttp2_encode_data(uint32_t id, grpc_slice_buffer* inbuf,
|
|
80
80
|
|
81
81
|
grpc_slice_buffer_move_first_no_ref(inbuf, write_bytes, outbuf);
|
82
82
|
|
83
|
-
grpc_core::
|
83
|
+
grpc_core::http2_global_stats().IncrementHttp2WriteDataFrameSize(write_bytes);
|
84
84
|
call_tracer->RecordOutgoingBytes({header_size, 0, 0});
|
85
85
|
}
|
86
86
|
|
@@ -108,19 +108,18 @@ grpc_error_handle grpc_chttp2_settings_parser_parse(void* p,
|
|
108
108
|
if (is_last) {
|
109
109
|
grpc_core::Http2Settings* target_settings =
|
110
110
|
parser->incoming_settings.get();
|
111
|
-
|
111
|
+
t->http2_stats->IncrementHttp2HeaderTableSize(
|
112
112
|
target_settings->header_table_size());
|
113
|
-
|
113
|
+
t->http2_stats->IncrementHttp2InitialWindowSize(
|
114
114
|
target_settings->initial_window_size());
|
115
|
-
|
115
|
+
t->http2_stats->IncrementHttp2MaxConcurrentStreams(
|
116
116
|
target_settings->max_concurrent_streams());
|
117
|
-
|
117
|
+
t->http2_stats->IncrementHttp2MaxFrameSize(
|
118
118
|
target_settings->max_frame_size());
|
119
|
-
|
119
|
+
t->http2_stats->IncrementHttp2MaxHeaderListSize(
|
120
120
|
target_settings->max_header_list_size());
|
121
|
-
|
122
|
-
|
123
|
-
target_settings->preferred_receive_crypto_message_size());
|
121
|
+
t->http2_stats->IncrementHttp2PreferredReceiveCryptoMessageSize(
|
122
|
+
target_settings->preferred_receive_crypto_message_size());
|
124
123
|
t->http2_ztrace_collector.Append([parser]() {
|
125
124
|
grpc_core::H2SettingsTrace<true> settings{false, {}};
|
126
125
|
// TODO(ctiller): produce actual wire settings here, not a
|
@@ -109,15 +109,14 @@ grpc_error_handle grpc_chttp2_window_update_parser_parse(
|
|
109
109
|
if (s != nullptr) {
|
110
110
|
grpc_core::Timestamp now = grpc_core::Timestamp::Now();
|
111
111
|
if (s->last_window_update_time != grpc_core::Timestamp::InfPast()) {
|
112
|
-
|
112
|
+
t->http2_stats->IncrementHttp2StreamWindowUpdatePeriod(
|
113
113
|
(now - s->last_window_update_time).millis());
|
114
114
|
}
|
115
115
|
s->last_window_update_time = now;
|
116
116
|
grpc_core::chttp2::StreamFlowControl::OutgoingUpdateContext(
|
117
117
|
&s->flow_control)
|
118
118
|
.RecvUpdate(received_update);
|
119
|
-
|
120
|
-
received_update);
|
119
|
+
t->http2_stats->IncrementHttp2StreamRemoteWindowUpdate(received_update);
|
121
120
|
if (grpc_chttp2_list_remove_stalled_by_stream(t, s)) {
|
122
121
|
grpc_chttp2_mark_stream_writable(t, s);
|
123
122
|
grpc_chttp2_initiate_write(
|
@@ -129,11 +128,11 @@ grpc_error_handle grpc_chttp2_window_update_parser_parse(
|
|
129
128
|
&t->flow_control);
|
130
129
|
grpc_core::Timestamp now = grpc_core::Timestamp::Now();
|
131
130
|
if (t->last_window_update_time != grpc_core::Timestamp::InfPast()) {
|
132
|
-
|
131
|
+
t->http2_stats->IncrementHttp2TransportWindowUpdatePeriod(
|
133
132
|
(now - t->last_window_update_time).millis());
|
134
133
|
}
|
135
134
|
t->last_window_update_time = now;
|
136
|
-
|
135
|
+
t->http2_stats->IncrementHttp2TransportRemoteWindowUpdate(
|
137
136
|
received_update);
|
138
137
|
upd.RecvUpdate(received_update);
|
139
138
|
if (upd.Finish() == grpc_core::chttp2::StallEdge::kUnstalled) {
|
@@ -0,0 +1,299 @@
|
|
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_HEADER_ASSEMBLER_H
|
20
|
+
#define GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HEADER_ASSEMBLER_H
|
21
|
+
|
22
|
+
#include <grpc/support/port_platform.h>
|
23
|
+
|
24
|
+
#include <cstddef>
|
25
|
+
#include <cstdint>
|
26
|
+
|
27
|
+
#include "absl/log/check.h"
|
28
|
+
#include "absl/log/log.h"
|
29
|
+
#include "src/core/call/metadata_batch.h"
|
30
|
+
#include "src/core/ext/transport/chttp2/transport/frame.h"
|
31
|
+
#include "src/core/ext/transport/chttp2/transport/hpack_encoder.h"
|
32
|
+
#include "src/core/ext/transport/chttp2/transport/hpack_parser.h"
|
33
|
+
#include "src/core/ext/transport/chttp2/transport/http2_status.h"
|
34
|
+
#include "src/core/lib/slice/slice.h"
|
35
|
+
#include "src/core/lib/slice/slice_buffer.h"
|
36
|
+
#include "src/core/util/shared_bit_gen.h"
|
37
|
+
|
38
|
+
// TODO(tjagtap) TODO(akshitpatel): [PH2][P3] : Write micro benchmarks for
|
39
|
+
// assembler and disassembler code
|
40
|
+
|
41
|
+
namespace grpc_core {
|
42
|
+
namespace http2 {
|
43
|
+
|
44
|
+
// If the Client Transport code is using HeaderAssembler in the wrong way,
|
45
|
+
// we fail with a DCHECK.
|
46
|
+
// If the peer sent some bad data, we fail with the appropriate Http2Status.
|
47
|
+
|
48
|
+
#define ASSEMBLER_LOG DVLOG(3)
|
49
|
+
|
50
|
+
constexpr absl::string_view kAssemblerContiguousSequenceError =
|
51
|
+
"RFC9113 : Field blocks MUST be transmitted as a contiguous sequence "
|
52
|
+
"of frames, with no interleaved frames of any other type or from any "
|
53
|
+
"other stream.";
|
54
|
+
|
55
|
+
constexpr absl::string_view kAssemblerMismatchedStreamId =
|
56
|
+
"CONTINUATION frame has a different Stream Identifier than the preceeding "
|
57
|
+
"HEADERS frame.";
|
58
|
+
|
59
|
+
constexpr absl::string_view kAssemblerHpackError =
|
60
|
+
"RFC9113 : A decoding error in a field block MUST be treated as a "
|
61
|
+
"connection error of type COMPRESSION_ERROR.";
|
62
|
+
|
63
|
+
constexpr absl::string_view kGrpcErrorMaxTwoHeaderFrames =
|
64
|
+
"Too many header frames sent by peer";
|
65
|
+
|
66
|
+
// A gRPC server is permitted to send both initial metadata and trailing
|
67
|
+
// metadata where initial metadata is optional. A gRPC C++ client is permitted
|
68
|
+
// to send only initial metadata. However, other gRPC Client implementations may
|
69
|
+
// send trailing metadata too. So we allow only a maximum of 2 metadata per
|
70
|
+
// streams. Which means only 2 HEADER frames are legal per stream.
|
71
|
+
constexpr uint8_t kMaxHeaderFrames = 2;
|
72
|
+
|
73
|
+
// TODO(tjagtap) : [PH2][P3] : Handle the case where a Server receives two
|
74
|
+
// header frames. Which means that the client sent trailing metadata. While we
|
75
|
+
// dont expect a gRPC C++ peer to behave like this, this might break interop
|
76
|
+
// tests and genuine interop cases.
|
77
|
+
|
78
|
+
// RFC9113
|
79
|
+
// https://www.rfc-editor.org/rfc/rfc9113.html#name-field-section-compression-a
|
80
|
+
// A complete field section (which contains our gRPC Metadata) consists of
|
81
|
+
// either: a single HEADERS or PUSH_PROMISE frame, with the END_HEADERS flag
|
82
|
+
// set, or a HEADERS or PUSH_PROMISE frame with the END_HEADERS flag unset
|
83
|
+
// and one or more CONTINUATION frames, where the last CONTINUATION frame
|
84
|
+
// has the END_HEADERS flag set.
|
85
|
+
//
|
86
|
+
// Each field block is processed as a discrete unit. Field blocks MUST be
|
87
|
+
// transmitted as a contiguous sequence of frames, with no interleaved
|
88
|
+
// frames of any other type or from any other stream. The last frame in a
|
89
|
+
// sequence of HEADERS or CONTINUATION frames has the END_HEADERS flag set.
|
90
|
+
//
|
91
|
+
// This class will first assemble all the header data into one SliceBuffer
|
92
|
+
// from each frame. And when END_HEADERS is received, the caller can generate
|
93
|
+
// the gRPC Metadata.
|
94
|
+
class HeaderAssembler {
|
95
|
+
public:
|
96
|
+
// Call this for each incoming HTTP2 Header frame.
|
97
|
+
// The payload of the Http2HeaderFrame will be cleared in this function.
|
98
|
+
Http2Status AppendHeaderFrame(Http2HeaderFrame&& frame) {
|
99
|
+
// Validate input frame
|
100
|
+
DCHECK_GT(frame.stream_id, 0u)
|
101
|
+
<< "RFC9113 : HEADERS frames MUST be associated with a stream.";
|
102
|
+
|
103
|
+
// Manage size constraints
|
104
|
+
const size_t current_len = frame.payload.Length();
|
105
|
+
if constexpr (sizeof(size_t) == 4) {
|
106
|
+
if (GPR_UNLIKELY(buffer_.Length() >= UINT32_MAX - current_len)) {
|
107
|
+
Cleanup();
|
108
|
+
LOG(ERROR)
|
109
|
+
<< "Stream Error: SliceBuffer overflow for 32 bit platforms.";
|
110
|
+
return Http2Status::Http2StreamError(
|
111
|
+
Http2ErrorCode::kInternalError,
|
112
|
+
"Stream Error: SliceBuffer overflow for 32 bit platforms.");
|
113
|
+
}
|
114
|
+
}
|
115
|
+
|
116
|
+
// Start header workflow
|
117
|
+
header_in_progress_ = true;
|
118
|
+
|
119
|
+
// Manage payload
|
120
|
+
frame.payload.MoveFirstNBytesIntoSliceBuffer(current_len, buffer_);
|
121
|
+
ASSEMBLER_LOG << "AppendHeaderFrame " << current_len << " Bytes.";
|
122
|
+
|
123
|
+
// Manage if last frame
|
124
|
+
if (frame.end_headers) {
|
125
|
+
ASSEMBLER_LOG << "AppendHeaderFrame end_headers";
|
126
|
+
is_ready_ = true;
|
127
|
+
}
|
128
|
+
|
129
|
+
return Http2Status::Ok();
|
130
|
+
}
|
131
|
+
|
132
|
+
// Call this for each incoming HTTP2 Continuation frame.
|
133
|
+
// The payload of the Http2ContinuationFrame will be cleared in this function.
|
134
|
+
Http2Status AppendContinuationFrame(Http2ContinuationFrame&& frame) {
|
135
|
+
// Manage payload
|
136
|
+
const size_t current_len = frame.payload.Length();
|
137
|
+
frame.payload.MoveFirstNBytesIntoSliceBuffer(current_len, buffer_);
|
138
|
+
ASSEMBLER_LOG << "AppendContinuationFrame " << current_len << " Bytes.";
|
139
|
+
|
140
|
+
// Manage if last frame
|
141
|
+
if (frame.end_headers) {
|
142
|
+
ASSEMBLER_LOG << "AppendHeaderFrame end_headers";
|
143
|
+
is_ready_ = true;
|
144
|
+
}
|
145
|
+
|
146
|
+
return Http2Status::Ok();
|
147
|
+
}
|
148
|
+
|
149
|
+
// The caller MUST check using IsReady() before calling this function
|
150
|
+
ValueOrHttp2Status<Arena::PoolPtr<grpc_metadata_batch>> ReadMetadata(
|
151
|
+
HPackParser& parser, bool is_initial_metadata, bool is_client) {
|
152
|
+
ASSEMBLER_LOG << "ReadMetadata " << buffer_.Length() << " Bytes.";
|
153
|
+
|
154
|
+
// Validate
|
155
|
+
DCHECK_EQ(is_ready_, true);
|
156
|
+
|
157
|
+
// Generate the gRPC Metadata from buffer_
|
158
|
+
// RFC9113 : A receiver MUST terminate the connection with a connection
|
159
|
+
// error (Section 5.4.1) of type COMPRESSION_ERROR if it does not decompress
|
160
|
+
// a field block. A decoding error in a field block MUST be treated as a
|
161
|
+
// connection error (Section 5.4.1) of type COMPRESSION_ERROR.
|
162
|
+
Arena::PoolPtr<grpc_metadata_batch> metadata =
|
163
|
+
Arena::MakePooledForOverwrite<grpc_metadata_batch>();
|
164
|
+
parser.BeginFrame(
|
165
|
+
/*grpc_metadata_batch*/ metadata.get(),
|
166
|
+
// TODO(tjagtap) : [PH2][P2] : Manage limits
|
167
|
+
/*metadata_size_soft_limit*/ std::numeric_limits<uint32_t>::max(),
|
168
|
+
/*metadata_size_hard_limit*/ std::numeric_limits<uint32_t>::max(),
|
169
|
+
is_initial_metadata ? HPackParser::Boundary::EndOfHeaders
|
170
|
+
: HPackParser::Boundary::EndOfStream,
|
171
|
+
HPackParser::Priority::None,
|
172
|
+
HPackParser::LogInfo{stream_id_,
|
173
|
+
is_initial_metadata
|
174
|
+
? HPackParser::LogInfo::Type::kHeaders
|
175
|
+
: HPackParser::LogInfo::Type::kTrailers,
|
176
|
+
is_client});
|
177
|
+
for (size_t i = 0; i < buffer_.Count(); i++) {
|
178
|
+
absl::Status result = parser.Parse(
|
179
|
+
buffer_.c_slice_at(i), i == buffer_.Count() - 1, SharedBitGen(),
|
180
|
+
/*call_tracer=*/nullptr);
|
181
|
+
if (GPR_UNLIKELY(!result.ok())) {
|
182
|
+
Cleanup();
|
183
|
+
LOG(ERROR) << "Connection Error: " << kAssemblerHpackError;
|
184
|
+
return Http2Status::Http2ConnectionError(
|
185
|
+
Http2ErrorCode::kCompressionError,
|
186
|
+
std::string(kAssemblerHpackError));
|
187
|
+
}
|
188
|
+
}
|
189
|
+
parser.FinishFrame();
|
190
|
+
|
191
|
+
Cleanup();
|
192
|
+
|
193
|
+
return ValueOrHttp2Status<Arena::PoolPtr<grpc_metadata_batch>>(
|
194
|
+
std::move(metadata));
|
195
|
+
}
|
196
|
+
|
197
|
+
size_t GetBufferedHeadersLength() const { return buffer_.Length(); }
|
198
|
+
|
199
|
+
// This value MUST be checked before calling ReadMetadata()
|
200
|
+
bool IsReady() const { return is_ready_; }
|
201
|
+
|
202
|
+
explicit HeaderAssembler(const uint32_t stream_id)
|
203
|
+
: header_in_progress_(false), is_ready_(false), stream_id_(stream_id) {}
|
204
|
+
|
205
|
+
~HeaderAssembler() = default;
|
206
|
+
|
207
|
+
HeaderAssembler(HeaderAssembler&& rvalue) = delete;
|
208
|
+
HeaderAssembler& operator=(HeaderAssembler&& rvalue) = delete;
|
209
|
+
HeaderAssembler(const HeaderAssembler&) = delete;
|
210
|
+
HeaderAssembler& operator=(const HeaderAssembler&) = delete;
|
211
|
+
|
212
|
+
private:
|
213
|
+
void Cleanup() {
|
214
|
+
buffer_.Clear();
|
215
|
+
header_in_progress_ = false;
|
216
|
+
is_ready_ = false;
|
217
|
+
}
|
218
|
+
|
219
|
+
bool header_in_progress_;
|
220
|
+
bool is_ready_;
|
221
|
+
const uint32_t stream_id_;
|
222
|
+
SliceBuffer buffer_;
|
223
|
+
};
|
224
|
+
|
225
|
+
class HeaderDisassembler {
|
226
|
+
public:
|
227
|
+
// This function will take ownership of metadata object
|
228
|
+
// The method will return false if encoding fails. A failed encoding operation
|
229
|
+
// is MUST be treated as a connection error by the caller.
|
230
|
+
// This function can queue a trailing metadata for sending even before the
|
231
|
+
// initial metadata has been extracted.
|
232
|
+
bool PrepareForSending(Arena::PoolPtr<grpc_metadata_batch>&& metadata,
|
233
|
+
HPackCompressor& encoder) {
|
234
|
+
// Validate disassembler state
|
235
|
+
DCHECK(!is_done_);
|
236
|
+
// Prepare metadata for sending
|
237
|
+
return encoder.EncodeRawHeaders(*metadata.get(), buffer_);
|
238
|
+
}
|
239
|
+
|
240
|
+
Http2Frame GetNextFrame(const uint32_t max_frame_length,
|
241
|
+
bool& out_end_headers) {
|
242
|
+
if (buffer_.Length() == 0 || is_done_) {
|
243
|
+
DCHECK(false) << "Calling code must check size using HasMoreData() "
|
244
|
+
"before GetNextFrame()";
|
245
|
+
}
|
246
|
+
out_end_headers = buffer_.Length() <= max_frame_length;
|
247
|
+
SliceBuffer temp;
|
248
|
+
if (out_end_headers) {
|
249
|
+
is_done_ = true;
|
250
|
+
temp.Swap(&buffer_);
|
251
|
+
} else {
|
252
|
+
buffer_.MoveFirstNBytesIntoSliceBuffer(max_frame_length, temp);
|
253
|
+
}
|
254
|
+
if (!did_send_header_frame_) {
|
255
|
+
did_send_header_frame_ = true;
|
256
|
+
return Http2HeaderFrame{stream_id_, out_end_headers, end_stream_,
|
257
|
+
std::move(temp)};
|
258
|
+
} else {
|
259
|
+
return Http2ContinuationFrame{stream_id_, out_end_headers,
|
260
|
+
std::move(temp)};
|
261
|
+
}
|
262
|
+
}
|
263
|
+
|
264
|
+
bool HasMoreData() const { return !is_done_ && buffer_.Length() > 0; }
|
265
|
+
|
266
|
+
// This number can be used for backpressure related calculations.
|
267
|
+
size_t GetBufferedLength() const { return buffer_.Length(); }
|
268
|
+
|
269
|
+
// A separate HeaderDisassembler object MUST be made for Initial Metadata and
|
270
|
+
// Trailing Metadata
|
271
|
+
explicit HeaderDisassembler(const uint32_t stream_id,
|
272
|
+
const bool is_trailing_metadata)
|
273
|
+
: stream_id_(stream_id),
|
274
|
+
end_stream_(is_trailing_metadata),
|
275
|
+
did_send_header_frame_(false),
|
276
|
+
is_done_(false) {}
|
277
|
+
|
278
|
+
~HeaderDisassembler() = default;
|
279
|
+
|
280
|
+
HeaderDisassembler(HeaderDisassembler&& rvalue) = delete;
|
281
|
+
HeaderDisassembler& operator=(HeaderDisassembler&& rvalue) = delete;
|
282
|
+
HeaderDisassembler(const HeaderDisassembler&) = delete;
|
283
|
+
HeaderDisassembler& operator=(const HeaderDisassembler&) = delete;
|
284
|
+
|
285
|
+
size_t TestOnlyGetMainBufferLength() const { return buffer_.Length(); }
|
286
|
+
|
287
|
+
private:
|
288
|
+
const uint32_t stream_id_;
|
289
|
+
const bool end_stream_;
|
290
|
+
bool did_send_header_frame_;
|
291
|
+
bool is_done_; // Protect against the same disassembler from being used twice
|
292
|
+
|
293
|
+
SliceBuffer buffer_;
|
294
|
+
};
|
295
|
+
|
296
|
+
} // namespace http2
|
297
|
+
} // namespace grpc_core
|
298
|
+
|
299
|
+
#endif // GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HEADER_ASSEMBLER_H
|
@@ -1137,7 +1137,7 @@ grpc_error_handle HPackParser::ParseInput(
|
|
1137
1137
|
input.bitsrc())) {
|
1138
1138
|
HandleMetadataSoftSizeLimitExceeded(&input);
|
1139
1139
|
}
|
1140
|
-
|
1140
|
+
http2_global_stats().IncrementHttp2MetadataSize(state_.frame_length);
|
1141
1141
|
if (call_tracer != nullptr && call_tracer->IsSampled() &&
|
1142
1142
|
metadata_buffer_ != nullptr) {
|
1143
1143
|
MetadataSizesAnnotation metadata_sizes_annotation(
|
@@ -33,6 +33,7 @@
|
|
33
33
|
#include "absl/strings/string_view.h"
|
34
34
|
#include "src/core/ext/transport/chttp2/transport/hpack_constants.h"
|
35
35
|
#include "src/core/ext/transport/chttp2/transport/hpack_parse_result.h"
|
36
|
+
#include "src/core/ext/transport/chttp2/transport/http2_stats_collector.h"
|
36
37
|
#include "src/core/lib/debug/trace.h"
|
37
38
|
#include "src/core/lib/slice/slice.h"
|
38
39
|
#include "src/core/telemetry/stats.h"
|
@@ -58,7 +59,7 @@ auto HPackTable::MementoRingBuffer::PopOne() -> Memento {
|
|
58
59
|
CHECK_GT(num_entries_, 0u);
|
59
60
|
size_t index = first_entry_ % max_entries_;
|
60
61
|
if (index == timestamp_index_) {
|
61
|
-
|
62
|
+
http2_stats_collector_->IncrementHttp2HpackEntryLifetime(
|
62
63
|
(Timestamp::Now() - timestamp_).millis());
|
63
64
|
timestamp_index_ = kNoTimestamp;
|
64
65
|
}
|
@@ -66,7 +67,7 @@ auto HPackTable::MementoRingBuffer::PopOne() -> Memento {
|
|
66
67
|
--num_entries_;
|
67
68
|
auto& entry = entries_[index];
|
68
69
|
if (!entry.parse_status.TestBit(Memento::kUsedBit)) {
|
69
|
-
|
70
|
+
http2_stats_collector_->IncrementHttp2HpackMisses();
|
70
71
|
}
|
71
72
|
return std::move(entry);
|
72
73
|
}
|
@@ -77,7 +78,7 @@ auto HPackTable::MementoRingBuffer::Lookup(uint32_t index) -> const Memento* {
|
|
77
78
|
auto& entry = entries_[offset];
|
78
79
|
const bool was_used = entry.parse_status.TestBit(Memento::kUsedBit);
|
79
80
|
entry.parse_status.SetBit(Memento::kUsedBit);
|
80
|
-
if (!was_used)
|
81
|
+
if (!was_used) http2_stats_collector_->IncrementHttp2HpackHits();
|
81
82
|
return &entry;
|
82
83
|
}
|
83
84
|
|
@@ -110,9 +111,9 @@ void HPackTable::MementoRingBuffer::ForEach(F f) const {
|
|
110
111
|
}
|
111
112
|
|
112
113
|
HPackTable::MementoRingBuffer::~MementoRingBuffer() {
|
113
|
-
ForEach([](uint32_t, const Memento& m) {
|
114
|
+
ForEach([this](uint32_t, const Memento& m) {
|
114
115
|
if (!m.parse_status.TestBit(Memento::kUsedBit)) {
|
115
|
-
|
116
|
+
http2_stats_collector_->IncrementHttp2HpackMisses();
|
116
117
|
}
|
117
118
|
});
|
118
119
|
}
|
@@ -124,6 +125,11 @@ void HPackTable::EvictOne() {
|
|
124
125
|
mem_used_ -= first_entry.md.transport_size();
|
125
126
|
}
|
126
127
|
|
128
|
+
void HPackTable::SetHttp2StatsCollector(
|
129
|
+
std::shared_ptr<Http2StatsCollector> http2_stats_collector) {
|
130
|
+
entries_.SetHttp2StatsCollector(http2_stats_collector);
|
131
|
+
}
|
132
|
+
|
127
133
|
void HPackTable::SetMaxBytes(uint32_t max_bytes) {
|
128
134
|
if (max_bytes_ == max_bytes) {
|
129
135
|
return;
|
@@ -33,6 +33,7 @@
|
|
33
33
|
#include "src/core/call/parsed_metadata.h"
|
34
34
|
#include "src/core/ext/transport/chttp2/transport/hpack_constants.h"
|
35
35
|
#include "src/core/ext/transport/chttp2/transport/hpack_parse_result.h"
|
36
|
+
#include "src/core/ext/transport/chttp2/transport/http2_stats_collector.h"
|
36
37
|
#include "src/core/util/no_destruct.h"
|
37
38
|
#include "src/core/util/unique_ptr_with_bitset.h"
|
38
39
|
|
@@ -49,6 +50,8 @@ class HPackTable {
|
|
49
50
|
HPackTable(HPackTable&&) = default;
|
50
51
|
HPackTable& operator=(HPackTable&&) = default;
|
51
52
|
|
53
|
+
void SetHttp2StatsCollector(
|
54
|
+
std::shared_ptr<Http2StatsCollector> http2_stats_collector);
|
52
55
|
void SetMaxBytes(uint32_t max_bytes);
|
53
56
|
bool SetCurrentTableSize(uint32_t bytes);
|
54
57
|
uint32_t current_table_size() { return current_table_bytes_; }
|
@@ -101,7 +104,8 @@ class HPackTable {
|
|
101
104
|
|
102
105
|
class MementoRingBuffer {
|
103
106
|
public:
|
104
|
-
MementoRingBuffer()
|
107
|
+
MementoRingBuffer()
|
108
|
+
: http2_stats_collector_(CreateHttp2StatsCollector(nullptr)) {}
|
105
109
|
~MementoRingBuffer();
|
106
110
|
|
107
111
|
MementoRingBuffer(const MementoRingBuffer&) = delete;
|
@@ -109,6 +113,11 @@ class HPackTable {
|
|
109
113
|
MementoRingBuffer(MementoRingBuffer&&) = default;
|
110
114
|
MementoRingBuffer& operator=(MementoRingBuffer&&) = default;
|
111
115
|
|
116
|
+
void SetHttp2StatsCollector(
|
117
|
+
std::shared_ptr<Http2StatsCollector> http2_stats_collector) {
|
118
|
+
http2_stats_collector_ = http2_stats_collector;
|
119
|
+
}
|
120
|
+
|
112
121
|
// Rebuild this buffer with a new max_entries_ size.
|
113
122
|
void Rebuild(uint32_t max_entries);
|
114
123
|
|
@@ -146,6 +155,8 @@ class HPackTable {
|
|
146
155
|
// The timestamp associated with timestamp_entry_.
|
147
156
|
Timestamp timestamp_;
|
148
157
|
|
158
|
+
std::shared_ptr<Http2StatsCollector> http2_stats_collector_ = nullptr;
|
159
|
+
|
149
160
|
std::vector<Memento> entries_;
|
150
161
|
};
|
151
162
|
|