diff --git a/api/envoy/config/overload/v3/overload.proto b/api/envoy/config/overload/v3/overload.proto index 4445af6321137..85fa761dbdd8e 100644 --- a/api/envoy/config/overload/v3/overload.proto +++ b/api/envoy/config/overload/v3/overload.proto @@ -141,6 +141,26 @@ message OverloadAction { google.protobuf.Any typed_config = 3; } +// Configuration for which accounts the WatermarkBuffer Factories should +// track. +message BufferFactoryConfig { + // The minimum power of two at which Envoy starts tracking an account. + // + // Envoy has 8 power of two buckets starting with the provided exponent below. + // Concretely the 1st bucket contains accounts for streams that use + // [2^minimum_account_to_track_power_of_two, + // 2^(minimum_account_to_track_power_of_two + 1)) bytes. + // With the 8th bucket tracking accounts + // >= 128 * 2^minimum_account_to_track_power_of_two. + // + // The maximum value is 56, since we're using uint64_t for bytes counting, + // and that's the last value that would use the 8 buckets. In practice, + // we don't expect the proxy to be holding 2^56 bytes. + // + // If omitted, Envoy should not do any tracking. + uint32 minimum_account_to_track_power_of_two = 1 [(validate.rules).uint32 = {lte: 56 gte: 10}]; +} + message OverloadManager { option (udpa.annotations.versioning).previous_message_type = "envoy.config.overload.v2alpha.OverloadManager"; @@ -153,4 +173,7 @@ message OverloadManager { // The set of overload actions. repeated OverloadAction actions = 3; + + // Configuration for buffer factory. + BufferFactoryConfig buffer_factory_config = 4; } diff --git a/envoy/api/BUILD b/envoy/api/BUILD index 55e267505ee54..904e5fff75f8a 100644 --- a/envoy/api/BUILD +++ b/envoy/api/BUILD @@ -18,6 +18,7 @@ envoy_cc_library( "//envoy/filesystem:filesystem_interface", "//envoy/server:process_context_interface", "//envoy/thread:thread_interface", + "@envoy_api//envoy/config/bootstrap/v3:pkg_cc_proto", ], ) diff --git a/envoy/api/api.h b/envoy/api/api.h index 89336aaf57347..c83198beed8be 100644 --- a/envoy/api/api.h +++ b/envoy/api/api.h @@ -5,6 +5,7 @@ #include "envoy/common/random_generator.h" #include "envoy/common/time.h" +#include "envoy/config/bootstrap/v3/bootstrap.pb.h" #include "envoy/event/dispatcher.h" #include "envoy/event/scaled_range_timer_manager.h" #include "envoy/filesystem/filesystem.h" @@ -83,6 +84,11 @@ class Api { * @return an optional reference to the ProcessContext */ virtual ProcessContextOptRef processContext() PURE; + + /** + * @return the bootstrap Envoy started with. + */ + virtual const envoy::config::bootstrap::v3::Bootstrap& bootstrap() const PURE; }; using ApiPtr = std::unique_ptr; diff --git a/generated_api_shadow/envoy/config/overload/v3/overload.proto b/generated_api_shadow/envoy/config/overload/v3/overload.proto index 1211e1cd49ddd..5ff2222987f6f 100644 --- a/generated_api_shadow/envoy/config/overload/v3/overload.proto +++ b/generated_api_shadow/envoy/config/overload/v3/overload.proto @@ -142,6 +142,26 @@ message OverloadAction { google.protobuf.Any typed_config = 3; } +// Configuration for which accounts the WatermarkBuffer Factories should +// track. +message BufferFactoryConfig { + // The minimum power of two at which Envoy starts tracking an account. + // + // Envoy has 8 power of two buckets starting with the provided exponent below. + // Concretely the 1st bucket contains accounts for streams that use + // [2^minimum_account_to_track_power_of_two, + // 2^(minimum_account_to_track_power_of_two + 1)) bytes. + // With the 8th bucket tracking accounts + // >= 128 * 2^minimum_account_to_track_power_of_two. + // + // The maximum value is 56, since we're using uint64_t for bytes counting, + // and that's the last value that would use the 8 buckets. In practice, + // we don't expect the proxy to be holding 2^56 bytes. + // + // If omitted, Envoy should not do any tracking. + uint32 minimum_account_to_track_power_of_two = 1 [(validate.rules).uint32 = {lte: 56 gte: 10}]; +} + message OverloadManager { option (udpa.annotations.versioning).previous_message_type = "envoy.config.overload.v2alpha.OverloadManager"; @@ -154,4 +174,7 @@ message OverloadManager { // The set of overload actions. repeated OverloadAction actions = 3; + + // Configuration for buffer factory. + BufferFactoryConfig buffer_factory_config = 4; } diff --git a/source/common/api/BUILD b/source/common/api/BUILD index 60412c4513432..950ea63a165cc 100644 --- a/source/common/api/BUILD +++ b/source/common/api/BUILD @@ -18,6 +18,7 @@ envoy_cc_library( "//source/common/common:thread_lib", "//source/common/event:dispatcher_lib", "//source/common/network:socket_lib", + "@envoy_api//envoy/config/bootstrap/v3:pkg_cc_proto", ], ) diff --git a/source/common/api/api_impl.cc b/source/common/api/api_impl.cc index 73de8f4a320c2..485fd5f50d8d2 100644 --- a/source/common/api/api_impl.cc +++ b/source/common/api/api_impl.cc @@ -3,6 +3,8 @@ #include #include +#include "envoy/config/bootstrap/v3/bootstrap.pb.h" + #include "source/common/common/thread.h" #include "source/common/event/dispatcher_impl.h" @@ -11,10 +13,12 @@ namespace Api { Impl::Impl(Thread::ThreadFactory& thread_factory, Stats::Store& store, Event::TimeSystem& time_system, Filesystem::Instance& file_system, - Random::RandomGenerator& random_generator, const ProcessContextOptRef& process_context, + Random::RandomGenerator& random_generator, + const envoy::config::bootstrap::v3::Bootstrap& bootstrap, + const ProcessContextOptRef& process_context, Buffer::WatermarkFactorySharedPtr watermark_factory) : thread_factory_(thread_factory), store_(store), time_system_(time_system), - file_system_(file_system), random_generator_(random_generator), + file_system_(file_system), random_generator_(random_generator), bootstrap_(bootstrap), process_context_(process_context), watermark_factory_(std::move(watermark_factory)) {} Event::DispatcherPtr Impl::allocateDispatcher(const std::string& name) { diff --git a/source/common/api/api_impl.h b/source/common/api/api_impl.h index 0bec3b866562d..9a9e1e3fad096 100644 --- a/source/common/api/api_impl.h +++ b/source/common/api/api_impl.h @@ -4,6 +4,7 @@ #include #include "envoy/api/api.h" +#include "envoy/config/bootstrap/v3/bootstrap.pb.h" #include "envoy/event/timer.h" #include "envoy/filesystem/filesystem.h" #include "envoy/network/socket.h" @@ -19,6 +20,7 @@ class Impl : public Api { public: Impl(Thread::ThreadFactory& thread_factory, Stats::Store& store, Event::TimeSystem& time_system, Filesystem::Instance& file_system, Random::RandomGenerator& random_generator, + const envoy::config::bootstrap::v3::Bootstrap& bootstrap, const ProcessContextOptRef& process_context = absl::nullopt, Buffer::WatermarkFactorySharedPtr watermark_factory = nullptr); @@ -34,6 +36,7 @@ class Impl : public Api { TimeSource& timeSource() override { return time_system_; } Stats::Scope& rootScope() override { return store_; } Random::RandomGenerator& randomGenerator() override { return random_generator_; } + const envoy::config::bootstrap::v3::Bootstrap& bootstrap() const override { return bootstrap_; } ProcessContextOptRef processContext() override { return process_context_; } private: @@ -42,6 +45,7 @@ class Impl : public Api { Event::TimeSystem& time_system_; Filesystem::Instance& file_system_; Random::RandomGenerator& random_generator_; + const envoy::config::bootstrap::v3::Bootstrap& bootstrap_; ProcessContextOptRef process_context_; const Buffer::WatermarkFactorySharedPtr watermark_factory_; }; diff --git a/source/common/buffer/BUILD b/source/common/buffer/BUILD index 9d531f683cf24..c5ea9bd23730d 100644 --- a/source/common/buffer/BUILD +++ b/source/common/buffer/BUILD @@ -17,6 +17,7 @@ envoy_cc_library( "//source/common/buffer:buffer_lib", "//source/common/common:assert_lib", "//source/common/runtime:runtime_features_lib", + "@envoy_api//envoy/config/overload/v3:pkg_cc_proto", ], ) diff --git a/source/common/buffer/watermark_buffer.cc b/source/common/buffer/watermark_buffer.cc index 1616afb542e0b..f426e98f65096 100644 --- a/source/common/buffer/watermark_buffer.cc +++ b/source/common/buffer/watermark_buffer.cc @@ -9,6 +9,11 @@ namespace Envoy { namespace Buffer { +namespace { +// Effectively disables tracking as this should zero out all reasonable account +// balances when shifted by this amount. +constexpr uint32_t kEffectivelyDisableTrackingBitshift = 63; +} // end namespace void WatermarkBuffer::add(const void* data, uint64_t size) { OwnedImpl::add(data, size); @@ -174,6 +179,12 @@ void WatermarkBufferFactory::unregisterAccount(const BufferMemoryAccountSharedPt } } +WatermarkBufferFactory::WatermarkBufferFactory( + const envoy::config::overload::v3::BufferFactoryConfig& config) + : bitshift_(config.minimum_account_to_track_power_of_two() + ? config.minimum_account_to_track_power_of_two() - 1 + : kEffectivelyDisableTrackingBitshift) {} + WatermarkBufferFactory::~WatermarkBufferFactory() { for (auto& account_set : size_class_account_sets_) { ASSERT(account_set.empty(), @@ -195,10 +206,10 @@ BufferMemoryAccountImpl::createAccount(WatermarkBufferFactory* factory, } int BufferMemoryAccountImpl::balanceToClassIndex() { - const uint64_t shifted_balance = buffer_memory_allocated_ >> 20; // shift by 1MB. + const uint64_t shifted_balance = buffer_memory_allocated_ >> factory_->bitshift(); if (shifted_balance == 0) { - return -1; // Not worth tracking anything < 1MB. + return -1; // Not worth tracking anything < configured minimum threshold } const int class_idx = absl::bit_width(shifted_balance) - 1; diff --git a/source/common/buffer/watermark_buffer.h b/source/common/buffer/watermark_buffer.h index 4c874c202f637..b980cd7720b0f 100644 --- a/source/common/buffer/watermark_buffer.h +++ b/source/common/buffer/watermark_buffer.h @@ -5,6 +5,7 @@ #include "envoy/buffer/buffer.h" #include "envoy/common/optref.h" +#include "envoy/config/overload/v3/overload.pb.h" #include "source/common/buffer/buffer_impl.h" @@ -182,6 +183,8 @@ class BufferMemoryAccountImpl : public BufferMemoryAccount { */ class WatermarkBufferFactory : public WatermarkFactory { public: + WatermarkBufferFactory(const envoy::config::overload::v3::BufferFactoryConfig& config); + // Buffer::WatermarkFactory ~WatermarkBufferFactory() override; InstancePtr createBuffer(std::function below_low_watermark, @@ -198,6 +201,8 @@ class WatermarkBufferFactory : public WatermarkFactory { void updateAccountClass(const BufferMemoryAccountSharedPtr& account, int current_class, int new_class); + uint32_t bitshift() const { return bitshift_; } + // Unregister a buffer memory account. virtual void unregisterAccount(const BufferMemoryAccountSharedPtr& account, int current_class); @@ -206,6 +211,9 @@ class WatermarkBufferFactory : public WatermarkFactory { using MemoryClassesToAccountsSet = std::array, BufferMemoryAccountImpl::NUM_MEMORY_CLASSES_>; MemoryClassesToAccountsSet size_class_account_sets_; + // How much to bit shift right balances to test whether the account should be + // tracked in *size_class_account_sets_*. + const uint32_t bitshift_; }; } // namespace Buffer diff --git a/source/common/event/BUILD b/source/common/event/BUILD index f847b9dd614fa..11ba35646e9af 100644 --- a/source/common/event/BUILD +++ b/source/common/event/BUILD @@ -47,6 +47,7 @@ envoy_cc_library( "//source/common/network:dns_lib", "//source/common/network:connection_lib", "//source/common/network:listener_lib", + "@envoy_api//envoy/config/overload/v3:pkg_cc_proto", ] + select({ "//bazel:apple": ["//source/common/network:apple_dns_lib"], "//conditions:default": [], diff --git a/source/common/event/dispatcher_impl.cc b/source/common/event/dispatcher_impl.cc index c9c48cb31a657..a7a30838aee9c 100644 --- a/source/common/event/dispatcher_impl.cc +++ b/source/common/event/dispatcher_impl.cc @@ -8,6 +8,7 @@ #include "envoy/api/api.h" #include "envoy/common/scope_tracker.h" +#include "envoy/config/overload/v3/overload.pb.h" #include "envoy/network/listen_socket.h" #include "envoy/network/listener.h" @@ -61,7 +62,8 @@ DispatcherImpl::DispatcherImpl(const std::string& name, Api::Api& api, : name_(name), api_(api), buffer_factory_(watermark_factory != nullptr ? watermark_factory - : std::make_shared()), + : std::make_shared( + api.bootstrap().overload_manager().buffer_factory_config())), scheduler_(time_system.createScheduler(base_scheduler_, base_scheduler_)), thread_local_delete_cb_( base_scheduler_.createSchedulableCallback([this]() -> void { runThreadLocalDelete(); })), diff --git a/source/server/config_validation/BUILD b/source/server/config_validation/BUILD index f33cd523ce856..bc6fd2391fcd5 100644 --- a/source/server/config_validation/BUILD +++ b/source/server/config_validation/BUILD @@ -26,6 +26,7 @@ envoy_cc_library( "//envoy/api:api_interface", "//envoy/filesystem:filesystem_interface", "//source/common/api:api_lib", + "@envoy_api//envoy/config/bootstrap/v3:pkg_cc_proto", ], ) diff --git a/source/server/config_validation/api.cc b/source/server/config_validation/api.cc index 75f8e755797c2..c9d4a2546d625 100644 --- a/source/server/config_validation/api.cc +++ b/source/server/config_validation/api.cc @@ -8,8 +8,9 @@ namespace Api { ValidationImpl::ValidationImpl(Thread::ThreadFactory& thread_factory, Stats::Store& stats_store, Event::TimeSystem& time_system, Filesystem::Instance& file_system, - Random::RandomGenerator& random_generator) - : Impl(thread_factory, stats_store, time_system, file_system, random_generator), + Random::RandomGenerator& random_generator, + const envoy::config::bootstrap::v3::Bootstrap& bootstrap) + : Impl(thread_factory, stats_store, time_system, file_system, random_generator, bootstrap), time_system_(time_system) {} Event::DispatcherPtr ValidationImpl::allocateDispatcher(const std::string& name) { diff --git a/source/server/config_validation/api.h b/source/server/config_validation/api.h index 6725362caa733..c1a64a65df54a 100644 --- a/source/server/config_validation/api.h +++ b/source/server/config_validation/api.h @@ -1,6 +1,7 @@ #pragma once #include "envoy/api/api.h" +#include "envoy/config/bootstrap/v3/bootstrap.pb.h" #include "envoy/event/timer.h" #include "envoy/filesystem/filesystem.h" @@ -17,7 +18,8 @@ class ValidationImpl : public Impl { public: ValidationImpl(Thread::ThreadFactory& thread_factory, Stats::Store& stats_store, Event::TimeSystem& time_system, Filesystem::Instance& file_system, - Random::RandomGenerator& random_generator); + Random::RandomGenerator& random_generator, + const envoy::config::bootstrap::v3::Bootstrap& bootstrap); Event::DispatcherPtr allocateDispatcher(const std::string& name) override; Event::DispatcherPtr allocateDispatcher(const std::string& name, diff --git a/source/server/config_validation/server.cc b/source/server/config_validation/server.cc index 69bc3db58654a..1eaac379016ab 100644 --- a/source/server/config_validation/server.cc +++ b/source/server/config_validation/server.cc @@ -45,8 +45,9 @@ ValidationInstance::ValidationInstance( : options_(options), validation_context_(options_.allowUnknownStaticFields(), !options.rejectUnknownDynamicFields(), !options.ignoreUnknownDynamicFields()), - stats_store_(store), api_(new Api::ValidationImpl(thread_factory, store, time_system, - file_system, random_generator_)), + stats_store_(store), + api_(new Api::ValidationImpl(thread_factory, store, time_system, file_system, + random_generator_, bootstrap_)), dispatcher_(api_->allocateDispatcher("main_thread")), singleton_manager_(new Singleton::ManagerImpl(api_->threadFactory())), access_log_manager_(options.fileFlushIntervalMsec(), *api_, *dispatcher_, access_log_lock, diff --git a/source/server/config_validation/server.h b/source/server/config_validation/server.h index e1c734d526275..4509400fcc90c 100644 --- a/source/server/config_validation/server.h +++ b/source/server/config_validation/server.h @@ -2,6 +2,7 @@ #include +#include "envoy/config/bootstrap/v3/bootstrap.pb.h" #include "envoy/config/core/v3/config_source.pb.h" #include "envoy/config/listener/v3/listener.pb.h" #include "envoy/config/listener/v3/listener_components.pb.h" @@ -195,11 +196,11 @@ class ValidationInstance final : Logger::Loggable, ProtobufMessage::ProdValidationContextImpl validation_context_; Stats::IsolatedStoreImpl& stats_store_; ThreadLocal::InstanceImpl thread_local_; + envoy::config::bootstrap::v3::Bootstrap bootstrap_; Api::ApiPtr api_; Event::DispatcherPtr dispatcher_; std::unique_ptr admin_; Singleton::ManagerPtr singleton_manager_; - envoy::config::bootstrap::v3::Bootstrap bootstrap_; std::unique_ptr runtime_singleton_; Random::RandomGeneratorImpl random_generator_; std::unique_ptr ssl_context_manager_; diff --git a/source/server/server.cc b/source/server/server.cc index 8ca82f4909315..6ab74b6007f7a 100644 --- a/source/server/server.cc +++ b/source/server/server.cc @@ -74,10 +74,10 @@ InstanceImpl::InstanceImpl( time_source_(time_system), restarter_(restarter), start_time_(time(nullptr)), original_start_time_(start_time_), stats_store_(store), thread_local_(tls), random_generator_(std::move(random_generator)), - api_(new Api::Impl(thread_factory, store, time_system, file_system, *random_generator_, - process_context ? ProcessContextOptRef(std::ref(*process_context)) - : absl::nullopt, - watermark_factory)), + api_(new Api::Impl( + thread_factory, store, time_system, file_system, *random_generator_, bootstrap_, + process_context ? ProcessContextOptRef(std::ref(*process_context)) : absl::nullopt, + watermark_factory)), dispatcher_(api_->allocateDispatcher("main_thread")), singleton_manager_(new Singleton::ManagerImpl(api_->threadFactory())), handler_(new ConnectionHandlerImpl(*dispatcher_, absl::nullopt)), diff --git a/source/server/server.h b/source/server/server.h index 36a017416317c..9234f6c2ae7b7 100644 --- a/source/server/server.h +++ b/source/server/server.h @@ -345,6 +345,7 @@ class InstanceImpl final : Logger::Loggable, Assert::ActionRegistrationPtr envoy_bug_action_registration_; ThreadLocal::Instance& thread_local_; Random::RandomGeneratorPtr random_generator_; + envoy::config::bootstrap::v3::Bootstrap bootstrap_; Api::ApiPtr api_; Event::DispatcherPtr dispatcher_; std::unique_ptr admin_; @@ -367,7 +368,6 @@ class InstanceImpl final : Logger::Loggable, std::unique_ptr worker_guard_dog_; bool terminated_; std::unique_ptr file_logger_; - envoy::config::bootstrap::v3::Bootstrap bootstrap_; ConfigTracker::EntryOwnerPtr config_tracker_entry_; SystemTime bootstrap_config_update_time_; Grpc::AsyncClientManagerPtr async_client_manager_; diff --git a/test/common/buffer/BUILD b/test/common/buffer/BUILD index 80bad25f619a7..43cfdcf596084 100644 --- a/test/common/buffer/BUILD +++ b/test/common/buffer/BUILD @@ -91,6 +91,7 @@ envoy_cc_test( "//test/integration:tracked_watermark_buffer_lib", "//test/mocks/buffer:buffer_mocks", "//test/mocks/http:stream_reset_handler_mock", + "@envoy_api//envoy/config/overload/v3:pkg_cc_proto", ], ) diff --git a/test/common/buffer/buffer_memory_account_test.cc b/test/common/buffer/buffer_memory_account_test.cc index 62f16f14d1b0c..c300bdf951172 100644 --- a/test/common/buffer/buffer_memory_account_test.cc +++ b/test/common/buffer/buffer_memory_account_test.cc @@ -1,3 +1,4 @@ +#include "envoy/config/overload/v3/overload.pb.h" #include "envoy/http/codec.h" #include "source/common/buffer/buffer_impl.h" @@ -34,7 +35,7 @@ static void noAccountsTracked(MemoryClassesToAccountsSet& memory_classes_to_acco class BufferMemoryAccountTest : public testing::Test { protected: - TrackedWatermarkBufferFactory factory_; + TrackedWatermarkBufferFactory factory_{absl::bit_width(kMinimumBalanceToTrack)}; Http::MockStreamResetHandler mock_reset_handler_; }; @@ -476,6 +477,19 @@ TEST_F(BufferMemoryAccountTest, RemainsInSameBucketIfChangesWithinThreshold) { account->clearDownstream(); } +TEST(WatermarkBufferFactoryTest, CanConfigureMinimumTrackingAmount) { + auto config = envoy::config::overload::v3::BufferFactoryConfig(); + config.set_minimum_account_to_track_power_of_two(3); + WatermarkBufferFactory factory(config); + EXPECT_EQ(factory.bitshift(), 2); +} + +TEST(WatermarkBufferFactoryTest, DefaultsToEffectivelyNotTracking) { + auto config = envoy::config::overload::v3::BufferFactoryConfig(); + WatermarkBufferFactory factory(config); + EXPECT_EQ(factory.bitshift(), 63); // Too large for any reasonable account size. +} + } // namespace } // namespace Buffer } // namespace Envoy diff --git a/test/integration/BUILD b/test/integration/BUILD index 240c938df891d..02d41812877fc 100644 --- a/test/integration/BUILD +++ b/test/integration/BUILD @@ -847,6 +847,7 @@ envoy_cc_test_library( "//test/test_common:test_time_system_interface", "//test/test_common:utility_lib", "@com_google_absl//absl/synchronization", + "@envoy_api//envoy/config/bootstrap/v3:pkg_cc_proto", "@envoy_api//envoy/config/listener/v3:pkg_cc_proto", "@envoy_api//envoy/extensions/transport_sockets/quic/v3:pkg_cc_proto", "@envoy_api//envoy/extensions/transport_sockets/tls/v3:pkg_cc_proto", @@ -1380,6 +1381,7 @@ envoy_cc_test_library( deps = [ "//source/common/buffer:watermark_buffer_lib", "//test/test_common:utility_lib", + "@envoy_api//envoy/config/overload/v3:pkg_cc_proto", ], ) diff --git a/test/integration/buffer_accounting_integration_test.cc b/test/integration/buffer_accounting_integration_test.cc index 430961cfdca4d..ceb7d7860380b 100644 --- a/test/integration/buffer_accounting_integration_test.cc +++ b/test/integration/buffer_accounting_integration_test.cc @@ -97,7 +97,8 @@ class Http2BufferWatermarksTest protected: std::shared_ptr buffer_factory_ = - std::make_shared(); + std::make_shared( + absl::bit_width(1024u * 1024u)); // Track >= 1MB bool streamBufferAccounting() { return std::get<1>(GetParam()); } diff --git a/test/integration/tracked_watermark_buffer.cc b/test/integration/tracked_watermark_buffer.cc index 79a5f99145f6c..67a5e0ff2f4b4 100644 --- a/test/integration/tracked_watermark_buffer.cc +++ b/test/integration/tracked_watermark_buffer.cc @@ -1,5 +1,6 @@ #include "test/integration/tracked_watermark_buffer.h" +#include "envoy/config/overload/v3/overload.pb.h" #include "envoy/thread/thread.h" #include "envoy/thread_local/thread_local.h" #include "envoy/thread_local/thread_local_object.h" @@ -9,6 +10,18 @@ namespace Envoy { namespace Buffer { +TrackedWatermarkBufferFactory::TrackedWatermarkBufferFactory() : TrackedWatermarkBufferFactory(0) {} + +TrackedWatermarkBufferFactory::TrackedWatermarkBufferFactory( + uint32_t minimum_account_to_track_power_of_two) + : WatermarkBufferFactory([minimum_account_to_track_power_of_two]() { + auto config = envoy::config::overload::v3::BufferFactoryConfig(); + if (minimum_account_to_track_power_of_two > 0) { + config.set_minimum_account_to_track_power_of_two(minimum_account_to_track_power_of_two); + } + return config; + }()) {} + TrackedWatermarkBufferFactory::~TrackedWatermarkBufferFactory() { ASSERT(active_buffer_count_ == 0); } diff --git a/test/integration/tracked_watermark_buffer.h b/test/integration/tracked_watermark_buffer.h index 99bc091956bb7..d308f8c53f8ad 100644 --- a/test/integration/tracked_watermark_buffer.h +++ b/test/integration/tracked_watermark_buffer.h @@ -61,7 +61,9 @@ class TrackedWatermarkBuffer : public Buffer::WatermarkBuffer { // Factory that tracks how the created buffers are used. class TrackedWatermarkBufferFactory : public WatermarkBufferFactory { public: - TrackedWatermarkBufferFactory() = default; + // Use the default minimum tracking threshold. + TrackedWatermarkBufferFactory(); + TrackedWatermarkBufferFactory(uint32_t min_tracking_bytes); ~TrackedWatermarkBufferFactory() override; // Buffer::WatermarkFactory Buffer::InstancePtr createBuffer(std::function below_low_watermark, diff --git a/test/integration/utility.cc b/test/integration/utility.cc index c6746cae7869d..a6eb50a495aab 100644 --- a/test/integration/utility.cc +++ b/test/integration/utility.cc @@ -5,6 +5,7 @@ #include #include +#include "envoy/config/bootstrap/v3/bootstrap.pb.h" #include "envoy/event/dispatcher.h" #include "envoy/extensions/transport_sockets/quic/v3/quic_transport.pb.h" #include "envoy/network/connection.h" @@ -187,8 +188,9 @@ IntegrationUtil::makeSingleRequest(const Network::Address::InstanceConstSharedPt NiceMock random; Event::GlobalTimeSystem time_system; NiceMock random_generator; + envoy::config::bootstrap::v3::Bootstrap bootstrap; Api::Impl api(Thread::threadFactoryForTest(), mock_stats_store, time_system, - Filesystem::fileSystemForTest(), random_generator); + Filesystem::fileSystemForTest(), random_generator, bootstrap); Event::DispatcherPtr dispatcher(api.allocateDispatcher("test_thread")); TestConnectionCallbacks connection_callbacks(*dispatcher); diff --git a/test/mocks/api/mocks.cc b/test/mocks/api/mocks.cc index dfd9345ae8063..c3eeed40d0c5c 100644 --- a/test/mocks/api/mocks.cc +++ b/test/mocks/api/mocks.cc @@ -8,6 +8,7 @@ using testing::_; using testing::Invoke; +using testing::ReturnRef; namespace Envoy { namespace Api { @@ -16,6 +17,7 @@ MockApi::MockApi() { ON_CALL(*this, fileSystem()).WillByDefault(ReturnRef(file_system_)); ON_CALL(*this, rootScope()).WillByDefault(ReturnRef(stats_store_)); ON_CALL(*this, randomGenerator()).WillByDefault(ReturnRef(random_)); + ON_CALL(*this, bootstrap()).WillByDefault(ReturnRef(empty_bootstrap_)); } MockApi::~MockApi() = default; diff --git a/test/mocks/api/mocks.h b/test/mocks/api/mocks.h index 94b5db59f99c2..ef6f02c999cbd 100644 --- a/test/mocks/api/mocks.h +++ b/test/mocks/api/mocks.h @@ -5,6 +5,7 @@ #include "envoy/api/api.h" #include "envoy/api/os_sys_calls.h" +#include "envoy/config/bootstrap/v3/bootstrap.pb.h" #include "envoy/event/dispatcher.h" #include "envoy/event/timer.h" @@ -47,12 +48,14 @@ class MockApi : public Api { MOCK_METHOD(Thread::ThreadFactory&, threadFactory, ()); MOCK_METHOD(Stats::Scope&, rootScope, ()); MOCK_METHOD(Random::RandomGenerator&, randomGenerator, ()); + MOCK_METHOD(const envoy::config::bootstrap::v3::Bootstrap&, bootstrap, (), (const)); MOCK_METHOD(ProcessContextOptRef, processContext, ()); testing::NiceMock file_system_; Event::GlobalTimeSystem time_system_; testing::NiceMock stats_store_; testing::NiceMock random_; + envoy::config::bootstrap::v3::Bootstrap empty_bootstrap_; }; class MockOsSysCalls : public OsSysCallsImpl { diff --git a/test/server/config_validation/BUILD b/test/server/config_validation/BUILD index 51ebda4ae37c4..03cddb20150e0 100644 --- a/test/server/config_validation/BUILD +++ b/test/server/config_validation/BUILD @@ -74,6 +74,7 @@ envoy_cc_test( "//test/test_common:environment_lib", "//test/test_common:network_utility_lib", "//test/test_common:test_time_lib", + "@envoy_api//envoy/config/bootstrap/v3:pkg_cc_proto", ], ) diff --git a/test/server/config_validation/dispatcher_test.cc b/test/server/config_validation/dispatcher_test.cc index 608135be22ae0..e72afe4cdc223 100644 --- a/test/server/config_validation/dispatcher_test.cc +++ b/test/server/config_validation/dispatcher_test.cc @@ -1,5 +1,7 @@ #include +#include "envoy/config/bootstrap/v3/bootstrap.pb.h" + #include "source/common/common/thread.h" #include "source/common/event/dispatcher_impl.h" #include "source/common/event/libevent.h" @@ -24,7 +26,7 @@ class ConfigValidation : public testing::TestWithParam( Thread::threadFactoryForTest(), stats_store_, test_time_.timeSystem(), - Filesystem::fileSystemForTest(), random_generator_); + Filesystem::fileSystemForTest(), random_generator_, bootstrap_); dispatcher_ = validation_->allocateDispatcher("test_thread"); } @@ -32,6 +34,7 @@ class ConfigValidation : public testing::TestWithParam random_generator_; + envoy::config::bootstrap::v3::Bootstrap bootstrap_; private: // Using config validation API. diff --git a/test/test_common/BUILD b/test/test_common/BUILD index 75a5445637854..97475f1e989d6 100644 --- a/test/test_common/BUILD +++ b/test/test_common/BUILD @@ -135,6 +135,7 @@ envoy_cc_test_library( "//source/common/protobuf:utility_lib", "//source/common/stats:stats_lib", "//test/mocks/stats:stats_mocks", + "@envoy_api//envoy/config/bootstrap/v3:pkg_cc_proto", "@envoy_api//envoy/config/cluster/v3:pkg_cc_proto", "@envoy_api//envoy/config/endpoint/v3:pkg_cc_proto", "@envoy_api//envoy/config/listener/v3:pkg_cc_proto", diff --git a/test/test_common/utility.cc b/test/test_common/utility.cc index 35b5305cd0a9b..1461cd0a9923c 100644 --- a/test/test_common/utility.cc +++ b/test/test_common/utility.cc @@ -12,6 +12,7 @@ #include "envoy/buffer/buffer.h" #include "envoy/common/platform.h" +#include "envoy/config/bootstrap/v3/bootstrap.pb.h" #include "envoy/config/cluster/v3/cluster.pb.h" #include "envoy/config/endpoint/v3/endpoint.pb.h" #include "envoy/config/listener/v3/listener.pb.h" @@ -399,6 +400,7 @@ class TestImplProvider { Event::GlobalTimeSystem global_time_system_; testing::NiceMock default_stats_store_; testing::NiceMock mock_random_generator_; + envoy::config::bootstrap::v3::Bootstrap empty_bootstrap_; }; class TestImpl : public TestImplProvider, public Impl { @@ -408,7 +410,7 @@ class TestImpl : public TestImplProvider, public Impl { Random::RandomGenerator* random = nullptr) : Impl(thread_factory, stats_store ? *stats_store : default_stats_store_, time_system ? *time_system : global_time_system_, file_system, - random ? *random : mock_random_generator_) {} + random ? *random : mock_random_generator_, empty_bootstrap_) {} }; ApiPtr createApiForTest() {