summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/buildtool/main/main.cpp28
-rw-r--r--src/buildtool/storage/garbage_collector.cpp3
-rw-r--r--src/buildtool/storage/storage.hpp65
-rw-r--r--src/buildtool/storage/uplinker.cpp4
-rw-r--r--src/other_tools/just_mr/main.cpp8
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);
}