From 3f09f97abb6516c8271c9ded4a0afc5e779b75dc Mon Sep 17 00:00:00 2001 From: Yury Kats Date: Fri, 2 Dec 2022 17:13:45 +0000 Subject: [PATCH 1/2] Reduce Route memory utilization by avoiding RuntimeData instances when not needed Currently an instance of RuntimeData is created in each route, even if no runtime fractions are configured. This PR switches the instance to unique_ptr and only creates RuntimeData objects when actually configured. This is a step towards more memory efficient config data structures. Issue #24154. Signed-off-by: Yury Kats --- source/common/router/config_impl.cc | 23 ++++++++++------------- source/common/router/config_impl.h | 5 +++-- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/source/common/router/config_impl.cc b/source/common/router/config_impl.cc index acafd14a47ad3..0d87e87799f3a 100644 --- a/source/common/router/config_impl.cc +++ b/source/common/router/config_impl.cc @@ -700,10 +700,11 @@ RouteEntryImplBase::RouteEntryImplBase(const VirtualHostImpl& vhost, } bool RouteEntryImplBase::evaluateRuntimeMatch(const uint64_t random_value) const { - return !runtime_ ? true - : loader_.snapshot().featureEnabled(runtime_->fractional_runtime_key_, - runtime_->fractional_runtime_default_, - random_value); + return runtime_ == nullptr + ? true + : loader_.snapshot().featureEnabled(runtime_->fractional_runtime_key_, + runtime_->fractional_runtime_default_, + random_value); } absl::string_view @@ -890,18 +891,14 @@ RouteEntryImplBase::getResponseHeaderParsers(bool specificity_ascend) const { specificity_ascend); } -absl::optional +std::unique_ptr RouteEntryImplBase::loadRuntimeData(const envoy::config::route::v3::RouteMatch& route_match) { - absl::optional runtime; - RuntimeData runtime_data; - if (route_match.has_runtime_fraction()) { - runtime_data.fractional_runtime_default_ = route_match.runtime_fraction().default_value(); - runtime_data.fractional_runtime_key_ = route_match.runtime_fraction().runtime_key(); - return runtime_data; + return std::make_unique( + {.fractional_runtime_default_ = route_match.runtime_fraction().default_value(), + .fractional_runtime_key_ = route_match.runtime_fraction().runtime_key()}); } - - return runtime; + return nullptr; } const std::string& diff --git a/source/common/router/config_impl.h b/source/common/router/config_impl.h index 06e15287473aa..89d6d56b591f4 100644 --- a/source/common/router/config_impl.h +++ b/source/common/router/config_impl.h @@ -967,7 +967,8 @@ class RouteEntryImplBase : public RouteEntryAndRoute, absl::InlinedVector getResponseHeaderParsers(bool specificity_ascend) const; - absl::optional loadRuntimeData(const envoy::config::route::v3::RouteMatch& route); + std::unique_ptr + loadRuntimeData(const envoy::config::route::v3::RouteMatch& route); static std::multimap parseOpaqueConfig(const envoy::config::route::v3::Route& route); @@ -1033,7 +1034,7 @@ class RouteEntryImplBase : public RouteEntryAndRoute, const absl::optional max_grpc_timeout_; const absl::optional grpc_timeout_offset_; Runtime::Loader& loader_; - const absl::optional runtime_; + std::unique_ptr runtime_; const std::string scheme_redirect_; const std::string host_redirect_; const std::string port_redirect_; From d351e45b4d2583e24a11ab232b8994be4c455bc9 Mon Sep 17 00:00:00 2001 From: Yury Kats Date: Fri, 2 Dec 2022 17:36:32 +0000 Subject: [PATCH 2/2] Fix build break Signed-off-by: Yury Kats --- source/common/router/config_impl.cc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/source/common/router/config_impl.cc b/source/common/router/config_impl.cc index 0d87e87799f3a..3b83596810dba 100644 --- a/source/common/router/config_impl.cc +++ b/source/common/router/config_impl.cc @@ -891,12 +891,13 @@ RouteEntryImplBase::getResponseHeaderParsers(bool specificity_ascend) const { specificity_ascend); } -std::unique_ptr +std::unique_ptr RouteEntryImplBase::loadRuntimeData(const envoy::config::route::v3::RouteMatch& route_match) { if (route_match.has_runtime_fraction()) { - return std::make_unique( - {.fractional_runtime_default_ = route_match.runtime_fraction().default_value(), - .fractional_runtime_key_ = route_match.runtime_fraction().runtime_key()}); + auto runtime_data = std::make_unique(); + runtime_data->fractional_runtime_default_ = route_match.runtime_fraction().default_value(); + runtime_data->fractional_runtime_key_ = route_match.runtime_fraction().runtime_key(); + return runtime_data; } return nullptr; }