summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/other_tools/ops_maps/TARGETS2
-rw-r--r--src/other_tools/ops_maps/git_tree_fetch_map.cpp130
2 files changed, 79 insertions, 53 deletions
diff --git a/src/other_tools/ops_maps/TARGETS b/src/other_tools/ops_maps/TARGETS
index 66a43e8a..d20de15c 100644
--- a/src/other_tools/ops_maps/TARGETS
+++ b/src/other_tools/ops_maps/TARGETS
@@ -120,9 +120,11 @@
, ["src/buildtool/common", "config"]
, ["src/buildtool/execution_api/common", "common"]
, ["src/buildtool/file_system", "file_system_manager"]
+ , ["src/buildtool/multithreading", "task_system"]
, ["src/buildtool/serve_api/remote", "serve_api"]
, ["src/buildtool/storage", "config"]
, ["src/buildtool/storage", "fs_utils"]
+ , ["src/buildtool/storage", "storage"]
, ["src/buildtool/system", "system_command"]
, ["src/other_tools/git_operations", "git_repo_remote"]
, ["src/other_tools/just_mr/progress_reporting", "progress"]
diff --git a/src/other_tools/ops_maps/git_tree_fetch_map.cpp b/src/other_tools/ops_maps/git_tree_fetch_map.cpp
index 8176c0b2..b1644d08 100644
--- a/src/other_tools/ops_maps/git_tree_fetch_map.cpp
+++ b/src/other_tools/ops_maps/git_tree_fetch_map.cpp
@@ -20,9 +20,11 @@
#include "src/buildtool/common/repository_config.hpp"
#include "src/buildtool/execution_api/common/execution_common.hpp"
#include "src/buildtool/file_system/file_system_manager.hpp"
+#include "src/buildtool/multithreading/task_system.hpp"
#include "src/buildtool/serve_api/remote/serve_api.hpp"
#include "src/buildtool/storage/config.hpp"
#include "src/buildtool/storage/fs_utils.hpp"
+#include "src/buildtool/storage/storage.hpp"
#include "src/buildtool/system/system_command.hpp"
#include "src/other_tools/git_operations/git_repo_remote.hpp"
#include "src/other_tools/just_mr/progress_reporting/progress.hpp"
@@ -30,6 +32,57 @@
namespace {
+void MoveCASTreeToGit(std::string const& tree_id,
+ ArtifactDigest const& digest,
+ gsl::not_null<ImportToGitMap*> const& import_to_git_map,
+ IExecutionApi* local_api,
+ gsl::not_null<TaskSystem*> const& ts,
+ GitTreeFetchMap::SetterPtr const& setter,
+ GitTreeFetchMap::LoggerPtr const& logger) {
+ // Move tree from CAS to local Git storage
+ auto tmp_dir = StorageUtils::CreateTypedTmpDir("fetch-remote-git-tree");
+ if (not tmp_dir) {
+ (*logger)(fmt::format("Failed to create tmp directory for copying "
+ "git-tree {} from remote CAS",
+ digest.hash()),
+ true);
+ return;
+ }
+ if (not local_api->RetrieveToPaths(
+ {Artifact::ObjectInfo{.digest = digest, .type = ObjectType::Tree}},
+ {tmp_dir->GetPath()})) {
+ (*logger)(fmt::format("Failed to copy git-tree {} to {}",
+ tree_id,
+ tmp_dir->GetPath().string()),
+ true);
+ return;
+ }
+ CommitInfo c_info{tmp_dir->GetPath(), "tree", tree_id};
+ import_to_git_map->ConsumeAfterKeysReady(
+ ts,
+ {std::move(c_info)},
+ [tmp_dir, // keep tmp_dir alive
+ setter,
+ logger](auto const& values) {
+ if (not values[0]->second) {
+ (*logger)("Importing to git failed",
+ /*fatal=*/true);
+ return;
+ }
+ // remote CAS already has the tree, so no need to even check
+ // backup_to_remote flag;
+ (*setter)(false /*no cache hit*/);
+ },
+ [logger, tmp_dir, tree_id](auto const& msg, bool fatal) {
+ (*logger)(fmt::format(
+ "While moving git-tree {} from {} to local git:\n{}",
+ tree_id,
+ tmp_dir->GetPath().string(),
+ msg),
+ fatal);
+ });
+}
+
void BackupToRemote(std::string const& tree_id,
IExecutionApi* remote_api,
GitTreeFetchMap::LoggerPtr const& logger) {
@@ -147,8 +200,23 @@ auto CreateGitTreeFetchMap(
(*setter)(true /*cache hit*/);
return;
}
+ // check if tree is known to local CAS
+ auto digest = ArtifactDigest{key.hash, 0, /*is_tree=*/true};
+ auto const& cas = Storage::Instance().CAS();
+ if (auto path = cas.TreePath(digest)) {
+ // import tree to Git cache
+ MoveCASTreeToGit(key.hash,
+ digest,
+ import_to_git_map,
+ local_api,
+ ts,
+ setter,
+ logger);
+ // done!
+ return;
+ }
JustMRProgress::Instance().TaskTracker().Start(key.origin);
- // check if content is known to remote serve service
+ // check if tree is known to remote serve service
if (serve_api_exists) {
// as we anyway interrogate the remote execution endpoint,
// we're only interested here in the serve endpoint making
@@ -157,7 +225,6 @@ auto CreateGitTreeFetchMap(
ServeApi::TreeInRemoteCAS(key.hash);
}
// check if tree is in remote CAS, if a remote is given
- auto digest = ArtifactDigest{key.hash, 0, /*is_tree=*/true};
if (remote_api != nullptr and local_api != nullptr and
remote_api->IsAvailable(digest) and
remote_api->RetrieveToCas(
@@ -165,57 +232,14 @@ auto CreateGitTreeFetchMap(
.type = ObjectType::Tree}},
local_api)) {
JustMRProgress::Instance().TaskTracker().Stop(key.origin);
- // Move tree from CAS to local Git storage
- auto tmp_dir = StorageUtils::CreateTypedTmpDir(
- "fetch-remote-git-tree");
- if (not tmp_dir) {
- (*logger)(fmt::format("Failed to create tmp "
- "directory for copying "
- "git-tree {} from remote CAS",
- key.hash),
- true);
- return;
- }
- if (not local_api->RetrieveToPaths(
- {Artifact::ObjectInfo{.digest = digest,
- .type = ObjectType::Tree}},
- {tmp_dir->GetPath()})) {
- (*logger)(
- fmt::format("Failed to copy git-tree {} to {}",
- key.hash,
- tmp_dir->GetPath().string()),
- true);
- return;
- }
- CommitInfo c_info{tmp_dir->GetPath(), "tree", key.hash};
- import_to_git_map->ConsumeAfterKeysReady(
- ts,
- {std::move(c_info)},
- [tmp_dir, // keep tmp_dir alive
- key,
- setter,
- logger](auto const& values) {
- if (not values[0]->second) {
- (*logger)("Importing to git failed",
- /*fatal=*/true);
- return;
- }
- // remote CAS already has the tree, so no need to
- // even check backup_to_remote flag;
- // success
- (*setter)(false /*no cache hit*/);
- },
- [logger, tmp_dir, tree_id = key.hash](auto const& msg,
- bool fatal) {
- (*logger)(
- fmt::format("While moving git-tree {} from "
- "{} to local git:\n{}",
- tree_id,
- tmp_dir->GetPath().string(),
- msg),
- fatal);
- });
-
+ MoveCASTreeToGit(key.hash,
+ digest,
+ import_to_git_map,
+ local_api,
+ ts,
+ setter,
+ logger);
+ // done!
return;
}
// create temporary location for command execution root