diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/buildtool/main/main.cpp | 28 | ||||
-rw-r--r-- | src/buildtool/storage/garbage_collector.cpp | 3 | ||||
-rw-r--r-- | src/buildtool/storage/storage.hpp | 65 | ||||
-rw-r--r-- | src/buildtool/storage/uplinker.cpp | 4 | ||||
-rw-r--r-- | src/other_tools/just_mr/main.cpp | 8 |
5 files changed, 44 insertions, 64 deletions
diff --git a/src/buildtool/main/main.cpp b/src/buildtool/main/main.cpp index 80b7ea14..d0c36d93 100644 --- a/src/buildtool/main/main.cpp +++ b/src/buildtool/main/main.cpp @@ -784,6 +784,8 @@ auto main(int argc, char* argv[]) -> int { return kExitFailure; } + auto const storage = Storage::Create(&StorageConfig::Instance()); + if (arguments.cmd == SubCommand::kGc) { if (GarbageCollector::TriggerGarbageCollection( StorageConfig::Instance(), arguments.gc.no_rotate)) { @@ -795,13 +797,12 @@ auto main(int argc, char* argv[]) -> int { if (arguments.cmd == SubCommand::kExecute) { SetupExecutionServiceConfig(arguments.service); ApiBundle const exec_apis{&StorageConfig::Instance(), - &Storage::Instance(), + &storage, /*repo_config=*/nullptr, &*auth_config, RemoteExecutionConfig::RemoteAddress()}; - if (not ServerImpl::Instance().Run(StorageConfig::Instance(), - Storage::Instance(), - exec_apis)) { + if (not ServerImpl::Instance().Run( + StorageConfig::Instance(), storage, exec_apis)) { return kExitFailure; } return kExitSuccess; @@ -816,16 +817,16 @@ auto main(int argc, char* argv[]) -> int { if (serve_server) { ApiBundle const serve_apis{ &StorageConfig::Instance(), - &Storage::Instance(), + &storage, /*repo_config=*/nullptr, &*auth_config, RemoteExecutionConfig::RemoteAddress()}; - auto serve = ServeApi::Create( - *serve_config, &Storage::Instance(), &serve_apis); + auto serve = + ServeApi::Create(*serve_config, &storage, &serve_apis); bool with_execute = not RemoteExecutionConfig::RemoteAddress(); return serve_server->Run(*serve_config, StorageConfig::Instance(), - Storage::Instance(), + storage, serve, serve_apis, with_execute) @@ -876,7 +877,7 @@ auto main(int argc, char* argv[]) -> int { std::exit(kExitFailure); } ApiBundle const main_apis{&StorageConfig::Instance(), - &Storage::Instance(), + &storage, &repo_config, &*auth_config, RemoteExecutionConfig::RemoteAddress()}; @@ -905,8 +906,7 @@ auto main(int argc, char* argv[]) -> int { : kExitFailure; } if (arguments.cmd == SubCommand::kAddToCas) { - return AddArtifactsToCas( - arguments.to_add, Storage::Instance(), main_apis) + return AddArtifactsToCas(arguments.to_add, storage, main_apis) ? kExitSuccess : kExitFailure; } @@ -917,7 +917,7 @@ auto main(int argc, char* argv[]) -> int { #ifndef BOOTSTRAP_BUILD_TOOL std::optional<ServeApi> serve = - ServeApi::Create(*serve_config, &Storage::Instance(), &main_apis); + ServeApi::Create(*serve_config, &storage, &main_apis); #else std::optional<ServeApi> serve; #endif // BOOTSTRAP_BUILD_TOOL @@ -993,7 +993,7 @@ auto main(int argc, char* argv[]) -> int { // create progress tracker for export targets Progress exports_progress{}; AnalyseContext analyse_ctx{.repo_config = &repo_config, - .storage = &Storage::Instance(), + .storage = &storage, .statistics = &stats, .progress = &exports_progress, .serve = serve ? &*serve : nullptr}; @@ -1095,7 +1095,7 @@ auto main(int argc, char* argv[]) -> int { jobs, main_apis, arguments.tc.target_cache_write_strategy, - Storage::Instance().TargetCache(), + storage.TargetCache(), nullptr, arguments.serve.remote_serve_address ? LogLevel::Performance diff --git a/src/buildtool/storage/garbage_collector.cpp b/src/buildtool/storage/garbage_collector.cpp index 45237413..3b3e5d28 100644 --- a/src/buildtool/storage/garbage_collector.cpp +++ b/src/buildtool/storage/garbage_collector.cpp @@ -223,8 +223,7 @@ auto GarbageCollector::Compactify(StorageConfig const& storage_config, // Compactification must be done for both native and compatible storages. auto compactify = [&storage_config, threshold](bool compatible) -> bool { Compatibility::SetCompatible(compatible); - auto gen_config = storage_config.CreateGenerationConfig(0); - auto const storage = ::Generation(gen_config); + auto const storage = ::Generation::Create(&storage_config); return Compactifier::RemoveInvalid(storage.CAS()) and Compactifier::RemoveSpliced(storage.CAS()) and diff --git a/src/buildtool/storage/storage.hpp b/src/buildtool/storage/storage.hpp index 070c8fa6..d4b070e3 100644 --- a/src/buildtool/storage/storage.hpp +++ b/src/buildtool/storage/storage.hpp @@ -16,10 +16,7 @@ #define INCLUDED_SRC_BUILDTOOL_STORAGE_STORAGE_HPP #include <cstddef> -#include <filesystem> #include <memory> -#include <optional> -#include <vector> #include "gsl/gsl" #include "src/buildtool/common/artifact.hpp" @@ -36,7 +33,7 @@ /// the affected storage instance (CAS, action cache, target cache). /// \tparam kDoGlobalUplink Enable global uplinking. template <bool kDoGlobalUplink> -class LocalStorage { +class LocalStorage final { public: static constexpr std::size_t kYoungest = 0U; @@ -45,11 +42,16 @@ class LocalStorage { using AC_t = LocalAC<kDoGlobalUplink>; using TC_t = ::TargetCache<kDoGlobalUplink>; - explicit LocalStorage(GenerationConfig const& config) - : uplinker_{std::make_shared<Uplinker_t>(config.storage_config)}, - cas_{std::make_shared<CAS_t>(config, &*uplinker_)}, - ac_{std::make_shared<AC_t>(&*cas_, config, &*uplinker_)}, - tc_{std::make_shared<TC_t>(&*cas_, config, &*uplinker_)} {} + [[nodiscard]] static auto Create( + gsl::not_null<StorageConfig const*> const& storage_config, + std::size_t generation = kYoungest) -> LocalStorage<kDoGlobalUplink> { + if constexpr (kDoGlobalUplink) { + // It is not allowed to enable uplinking for old generations. + EnsuresAudit(generation == kYoungest); + } + auto gen_config = storage_config->CreateGenerationConfig(generation); + return LocalStorage<kDoGlobalUplink>{gen_config}; + } /// \brief Get the CAS instance. [[nodiscard]] auto CAS() const noexcept -> CAS_t const& { return *cas_; } @@ -65,10 +67,16 @@ class LocalStorage { } private: - std::shared_ptr<Uplinker_t const> uplinker_; - std::shared_ptr<CAS_t const> cas_; - std::shared_ptr<AC_t const> ac_; - std::shared_ptr<TC_t const> tc_; + std::unique_ptr<Uplinker_t const> uplinker_; + std::unique_ptr<CAS_t const> cas_; + std::unique_ptr<AC_t const> ac_; + std::unique_ptr<TC_t const> tc_; + + explicit LocalStorage(GenerationConfig const& config) + : uplinker_{std::make_unique<Uplinker_t>(config.storage_config)}, + cas_{std::make_unique<CAS_t>(config, &*uplinker_)}, + ac_{std::make_unique<AC_t>(&*cas_, config, &*uplinker_)}, + tc_{std::make_unique<TC_t>(&*cas_, config, &*uplinker_)} {} }; #ifdef BOOTSTRAP_BUILD_TOOL @@ -81,35 +89,6 @@ constexpr auto kDefaultDoGlobalUplink = true; /// \brief Generation type, local storage without global uplinking. using Generation = LocalStorage</*kDoGlobalUplink=*/false>; -/// \brief Global storage singleton class, valid throughout the entire tool. -/// Configured via \ref StorageConfig. -class Storage : public LocalStorage<kDefaultDoGlobalUplink> { - public: - /// \brief Get the global storage instance. - /// Build root is read from \ref - /// StorageConfig::Instance().BuildRoot(). - /// \returns The global storage singleton instance. - [[nodiscard]] static auto Instance() noexcept -> Storage const& { - return GetStorage(); - } - - /// \brief Reinitialize storage instance and generations. - /// Use if global \ref StorageConfig was changed. Not thread-safe! - static void Reinitialize() noexcept { GetStorage() = CreateStorage(); } - - private: - using LocalStorage<kDefaultDoGlobalUplink>::LocalStorage; - - [[nodiscard]] static auto CreateStorage() noexcept -> Storage { - auto gen_config = StorageConfig::Instance().CreateGenerationConfig( - Storage::kYoungest); - return Storage{gen_config}; - } - - [[nodiscard]] static auto GetStorage() noexcept -> Storage& { - static auto instance = CreateStorage(); - return instance; - } -}; +using Storage = LocalStorage<kDefaultDoGlobalUplink>; #endif // INCLUDED_SRC_BUILDTOOL_STORAGE_STORAGE_HPP diff --git a/src/buildtool/storage/uplinker.cpp b/src/buildtool/storage/uplinker.cpp index 42213b33..de6cfb99 100644 --- a/src/buildtool/storage/uplinker.cpp +++ b/src/buildtool/storage/uplinker.cpp @@ -34,8 +34,8 @@ namespace { std::vector<Generation> generations; generations.reserve(storage_config->NumGenerations()); for (std::size_t i = 0; i < storage_config->NumGenerations(); ++i) { - auto const gen_config = storage_config->CreateGenerationConfig(i); - generations.emplace_back(gen_config); + generations.emplace_back(Generation::Create(storage_config, + /*generation=*/i)); } return generations; } diff --git a/src/other_tools/just_mr/main.cpp b/src/other_tools/just_mr/main.cpp index 815d6453..98e1de2c 100644 --- a/src/other_tools/just_mr/main.cpp +++ b/src/other_tools/just_mr/main.cpp @@ -296,6 +296,8 @@ auto main(int argc, char* argv[]) -> int { return kExitGenericFailure; } + auto const storage = Storage::Create(&StorageConfig::Instance()); + // check for conflicts in main repo name if ((not arguments.setup.sub_all) and arguments.common.main and arguments.setup.sub_main and @@ -346,7 +348,7 @@ auto main(int argc, char* argv[]) -> int { arguments.retry, arguments.launch_fwd, StorageConfig::Instance(), - Storage::Instance(), + storage, forward_build_root, my_name); } @@ -376,7 +378,7 @@ auto main(int argc, char* argv[]) -> int { arguments.just_cmd, arguments.auth, StorageConfig::Instance(), - Storage::Instance(), + storage, /*interactive=*/(arguments.cmd == SubCommand::kSetupEnv), my_name); // dump resulting config to stdout @@ -424,7 +426,7 @@ auto main(int argc, char* argv[]) -> int { arguments.fetch, arguments.auth, StorageConfig::Instance(), - Storage::Instance(), + storage, my_name); } |