From 4fd7130b07c001d2a27ab621af96cb6797f3aad1 Mon Sep 17 00:00:00 2001 From: Wayne Zhang Date: Thu, 13 Sep 2018 19:37:04 +0000 Subject: [PATCH] To share mixer client across listeners Signed-off-by: Wayne Zhang --- src/envoy/http/mixer/config.h | 1 + src/envoy/http/mixer/control_factory.h | 1 + src/envoy/http/mixer/filter_factory.cc | 23 +++++++++++++++++++---- src/envoy/tcp/mixer/config.h | 1 + src/envoy/tcp/mixer/control_factory.h | 1 + src/envoy/tcp/mixer/filter_factory.cc | 24 +++++++++++++++++++----- 6 files changed, 42 insertions(+), 9 deletions(-) diff --git a/src/envoy/http/mixer/config.h b/src/envoy/http/mixer/config.h index c72823f65a9..dfca3516adf 100644 --- a/src/envoy/http/mixer/config.h +++ b/src/envoy/http/mixer/config.h @@ -45,6 +45,7 @@ class Config { // The Http client config. ::istio::mixer::v1::config::client::HttpClientConfig config_pb_; }; +typedef std::unique_ptr ConfigPtr; } // namespace Mixer } // namespace Http diff --git a/src/envoy/http/mixer/control_factory.h b/src/envoy/http/mixer/control_factory.h index 83ff0e84ee9..673f019a4d8 100644 --- a/src/envoy/http/mixer/control_factory.h +++ b/src/envoy/http/mixer/control_factory.h @@ -63,6 +63,7 @@ class ControlFactory : public Logger::Loggable { // This stats object. Utils::MixerFilterStats stats_; }; +typedef std::shared_ptr ControlFactorySharedPtr; } // namespace Mixer } // namespace Http diff --git a/src/envoy/http/mixer/filter_factory.cc b/src/envoy/http/mixer/filter_factory.cc index c46c97d6577..af7d749c6cf 100644 --- a/src/envoy/http/mixer/filter_factory.cc +++ b/src/envoy/http/mixer/filter_factory.cc @@ -75,10 +75,8 @@ class MixerConfigFactory : public NamedHttpFilterConfigFactory { Http::FilterFactoryCb createFilterFactory(const HttpClientConfig& config_pb, const std::string&, FactoryContext& context) { - std::unique_ptr config_obj( - new Http::Mixer::Config(config_pb)); - auto control_factory = std::make_shared( - std::move(config_obj), context); + auto config_obj = std::make_unique(config_pb); + auto control_factory = getControlFactory(std::move(config_obj), context); return [control_factory]( Http::FilterChainFactoryCallbacks& callbacks) -> void { std::shared_ptr instance = @@ -87,6 +85,23 @@ class MixerConfigFactory : public NamedHttpFilterConfigFactory { callbacks.addAccessLogHandler(AccessLog::InstanceSharedPtr(instance)); }; } + + Http::Mixer::ControlFactorySharedPtr getControlFactory( + Http::Mixer::ConfigPtr config_obj, FactoryContext& context) { + const std::string hash = config_obj->config_pb().SerializeAsString(); + Http::Mixer::ControlFactorySharedPtr control_factory = + control_factory_maps_[hash].lock(); + if (!control_factory) { + control_factory = std::make_shared( + std::move(config_obj), context); + control_factory_maps_[hash] = control_factory; + } + return control_factory; + } + + // A weak pointer map to share control factory across different listeners. + std::unordered_map> + control_factory_maps_; }; static Registry::RegisterFactory ConfigPtr; } // namespace Mixer } // namespace Tcp diff --git a/src/envoy/tcp/mixer/control_factory.h b/src/envoy/tcp/mixer/control_factory.h index a33c08151c6..5ec6f4f2f65 100644 --- a/src/envoy/tcp/mixer/control_factory.h +++ b/src/envoy/tcp/mixer/control_factory.h @@ -70,6 +70,7 @@ class ControlFactory : public Logger::Loggable { // UUID of the Envoy TCP mixer filter. const std::string uuid_; }; +typedef std::shared_ptr ControlFactorySharedPtr; } // namespace Mixer } // namespace Tcp diff --git a/src/envoy/tcp/mixer/filter_factory.cc b/src/envoy/tcp/mixer/filter_factory.cc index fe9732a8865..3fa9067ff78 100644 --- a/src/envoy/tcp/mixer/filter_factory.cc +++ b/src/envoy/tcp/mixer/filter_factory.cc @@ -52,11 +52,8 @@ class FilterFactory : public NamedNetworkFilterConfigFactory { private: Network::FilterFactoryCb createFilterFactory(const TcpClientConfig& config_pb, FactoryContext& context) { - std::unique_ptr config_obj( - new Tcp::Mixer::Config(config_pb)); - - auto control_factory = std::make_shared( - std::move(config_obj), context); + auto config_obj = std::make_unique(config_pb); + auto control_factory = getControlFactory(std::move(config_obj), context); return [control_factory](Network::FilterManager& filter_manager) -> void { std::shared_ptr instance = std::make_shared(control_factory->control()); @@ -64,6 +61,23 @@ class FilterFactory : public NamedNetworkFilterConfigFactory { filter_manager.addWriteFilter(Network::WriteFilterSharedPtr(instance)); }; } + + Tcp::Mixer::ControlFactorySharedPtr getControlFactory( + Tcp::Mixer::ConfigPtr config_obj, FactoryContext& context) { + const std::string hash = config_obj->config_pb().SerializeAsString(); + Tcp::Mixer::ControlFactorySharedPtr control_factory = + control_factory_maps_[hash].lock(); + if (!control_factory) { + control_factory = std::make_shared( + std::move(config_obj), context); + control_factory_maps_[hash] = control_factory; + } + return control_factory; + } + + // A weak pointer map to share control factory across different listeners. + std::unordered_map> + control_factory_maps_; }; static Registry::RegisterFactory