LCOV - code coverage report
Current view: top level - source/extensions/common/async_files - async_file_manager_factory.cc (source / functions) Hit Total Coverage
Test: coverage.dat Lines: 24 28 85.7 %
Date: 2024-01-05 06:35:25 Functions: 3 3 100.0 %

          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

Generated by: LCOV version 1.15