Line data Source code
1 : #include "source/extensions/common/async_files/async_file_manager_factory.h" 2 : 3 : #include <memory> 4 : #include <string> 5 : 6 : #include "source/common/api/os_sys_calls_impl.h" 7 : #include "source/common/protobuf/utility.h" 8 : #include "source/extensions/common/async_files/async_file_manager_thread_pool.h" 9 : 10 : #include "absl/base/thread_annotations.h" 11 : #include "absl/container/flat_hash_map.h" 12 : 13 : namespace Envoy { 14 : namespace Extensions { 15 : namespace Common { 16 : namespace AsyncFiles { 17 : 18 : namespace { 19 : struct ManagerAndConfig { 20 : std::shared_ptr<AsyncFileManager> manager; 21 : const envoy::extensions::common::async_files::v3::AsyncFileManagerConfig config; 22 : }; 23 : } // namespace 24 : 25 : SINGLETON_MANAGER_REGISTRATION(async_file_manager_factory_singleton); 26 : 27 : class AsyncFileManagerFactoryImpl : public AsyncFileManagerFactory { 28 : public: 29 : static std::shared_ptr<AsyncFileManagerFactory> singleton(Singleton::Manager* singleton_manager); 30 : std::shared_ptr<AsyncFileManager> getAsyncFileManager( 31 : const envoy::extensions::common::async_files::v3::AsyncFileManagerConfig& config, 32 : Api::OsSysCalls* substitute_posix_file_operations = nullptr) 33 : ABSL_LOCKS_EXCLUDED(mu_) override; 34 : 35 : private: 36 : absl::Mutex mu_; 37 : absl::flat_hash_map<std::string, ManagerAndConfig> managers_ ABSL_GUARDED_BY(mu_); 38 : }; 39 : 40 : std::shared_ptr<AsyncFileManagerFactory> 41 4 : AsyncFileManagerFactory::singleton(Singleton::Manager* singleton_manager) { 42 4 : return singleton_manager->getTyped<AsyncFileManagerFactory>( 43 4 : SINGLETON_MANAGER_REGISTERED_NAME(async_file_manager_factory_singleton), 44 4 : [] { return std::make_shared<AsyncFileManagerFactoryImpl>(); }); 45 4 : } 46 : 47 : std::shared_ptr<AsyncFileManager> AsyncFileManagerFactoryImpl::getAsyncFileManager( 48 : const envoy::extensions::common::async_files::v3::AsyncFileManagerConfig& config, 49 3 : Api::OsSysCalls* substitute_posix_file_operations) { 50 3 : Api::OsSysCalls& posix = substitute_posix_file_operations == nullptr 51 3 : ? Api::OsSysCallsSingleton::get() 52 3 : : *substitute_posix_file_operations; 53 3 : absl::MutexLock lock(&mu_); 54 3 : auto it = managers_.find(config.id()); 55 3 : if (it == managers_.end()) { 56 2 : switch (config.manager_type_case()) { 57 2 : case envoy::extensions::common::async_files::v3::AsyncFileManagerConfig::kThreadPool: 58 2 : it = managers_ 59 2 : .insert({config.id(), 60 2 : ManagerAndConfig{ 61 2 : std::make_shared<AsyncFileManagerThreadPool>(config, posix), config}}) 62 2 : .first; 63 2 : break; 64 0 : case envoy::extensions::common::async_files::v3::AsyncFileManagerConfig::MANAGER_TYPE_NOT_SET: 65 : // This is theoretically unreachable due to proto validation 'required', but it's possible 66 : // for code to have modified the proto post-validation. 67 0 : throw EnvoyException("unrecognized AsyncFileManagerConfig::ManagerType"); 68 2 : }; 69 2 : } else if (!Protobuf::util::MessageDifferencer::Equivalent(it->second.config, config)) { 70 0 : throw EnvoyException("AsyncFileManager mismatched config"); 71 0 : } 72 3 : return it->second.manager; 73 3 : } 74 : 75 : } // namespace AsyncFiles 76 : } // namespace Common 77 : } // namespace Extensions 78 : } // namespace Envoy