@@ -75,10 +75,8 @@ class MixerConfigFactory : public NamedHttpFilterConfigFactory {
7575 Http::FilterFactoryCb createFilterFactory (const HttpClientConfig& config_pb,
7676 const std::string&,
7777 FactoryContext& context) {
78- std::unique_ptr<Http::Mixer::Config> config_obj (
79- new Http::Mixer::Config (config_pb));
80- auto control_factory = std::make_shared<Http::Mixer::ControlFactory>(
81- std::move (config_obj), context);
78+ auto config_obj = std::make_unique<Http::Mixer::Config>(config_pb);
79+ auto control_factory = getControlFactory (std::move (config_obj), context);
8280 return [control_factory](
8381 Http::FilterChainFactoryCallbacks& callbacks) -> void {
8482 std::shared_ptr<Http::Mixer::Filter> instance =
@@ -87,6 +85,23 @@ class MixerConfigFactory : public NamedHttpFilterConfigFactory {
8785 callbacks.addAccessLogHandler (AccessLog::InstanceSharedPtr (instance));
8886 };
8987 }
88+
89+ Http::Mixer::ControlFactorySharedPtr getControlFactory (
90+ Http::Mixer::ConfigPtr config_obj, FactoryContext& context) {
91+ const std::string hash = config_obj->config_pb ().SerializeAsString ();
92+ Http::Mixer::ControlFactorySharedPtr control_factory =
93+ control_factory_maps_[hash].lock ();
94+ if (!control_factory) {
95+ control_factory = std::make_shared<Http::Mixer::ControlFactory>(
96+ std::move (config_obj), context);
97+ control_factory_maps_[hash] = control_factory;
98+ }
99+ return control_factory;
100+ }
101+
102+ // A weak pointer map to share control factory across different listeners.
103+ std::unordered_map<std::string, std::weak_ptr<Http::Mixer::ControlFactory>>
104+ control_factory_maps_;
90105};
91106
92107static Registry::RegisterFactory<MixerConfigFactory,
0 commit comments