summaryrefslogtreecommitdiff
path: root/src/buildtool/serve_api/serve_service/source_tree.cpp
diff options
context:
space:
mode:
authorPaul Cristian Sarbu <paul.cristian.sarbu@huawei.com>2024-01-03 15:04:31 +0100
committerPaul Cristian Sarbu <paul.cristian.sarbu@huawei.com>2024-01-08 15:36:34 +0100
commitd2265d407b389a97d587d4f44395182395ff1c24 (patch)
tree95e807b71b13aead8cb463a28f74c3b908a8483f /src/buildtool/serve_api/serve_service/source_tree.cpp
parent44005b4e7d7bd6b445b4265902a8104197ecd857 (diff)
downloadjustbuild-d2265d407b389a97d587d4f44395182395ff1c24.tar.gz
serve content or tree: Check for Git object also in local CAS
Diffstat (limited to 'src/buildtool/serve_api/serve_service/source_tree.cpp')
-rw-r--r--src/buildtool/serve_api/serve_service/source_tree.cpp28
1 files changed, 24 insertions, 4 deletions
diff --git a/src/buildtool/serve_api/serve_service/source_tree.cpp b/src/buildtool/serve_api/serve_service/source_tree.cpp
index 2febcfe2..a95ca0c0 100644
--- a/src/buildtool/serve_api/serve_service/source_tree.cpp
+++ b/src/buildtool/serve_api/serve_service/source_tree.cpp
@@ -745,11 +745,11 @@ auto SourceTreeService::ServeContent(
response->set_status(ServeContentResponse::INTERNAL_ERROR);
return ::grpc::Status::OK;
}
+ auto const digest = ArtifactDigest{content, 0, /*is_tree=*/false};
// check if content blob is in Git cache
if (auto data =
GetBlobFromRepo(StorageConfig::GitRoot(), content, logger_)) {
// upload blob to remote CAS
- auto digest = ArtifactDigest{content, 0, /*is_tree=*/false};
auto repo = RepositoryConfig{};
if (not repo.SetGitCAS(StorageConfig::GitRoot())) {
auto str = fmt::format("Failed to SetGitCAS at {}",
@@ -777,7 +777,6 @@ auto SourceTreeService::ServeContent(
for (auto const& path : RemoteServeConfig::KnownRepositories()) {
if (auto data = GetBlobFromRepo(path, content, logger_)) {
// upload blob to remote CAS
- auto digest = ArtifactDigest{content, 0, /*is_tree=*/false};
auto repo = RepositoryConfig{};
if (not repo.SetGitCAS(path)) {
auto str =
@@ -804,6 +803,17 @@ auto SourceTreeService::ServeContent(
return ::grpc::Status::OK;
}
}
+ // check also in the local CAS
+ if (local_api_->IsAvailable(digest) and
+ not local_api_->RetrieveToCas(
+ {Artifact::ObjectInfo{.digest = digest, .type = ObjectType::File}},
+ &(*remote_api_))) {
+ auto str =
+ fmt::format("Failed to sync content {} from local CAS", content);
+ logger_->Emit(LogLevel::Error, str);
+ response->set_status(ServeContentResponse::SYNC_ERROR);
+ return ::grpc::Status::OK;
+ }
// content blob not known
response->set_status(ServeContentResponse::NOT_FOUND);
return ::grpc::Status::OK;
@@ -822,10 +832,10 @@ auto SourceTreeService::ServeTree(
response->set_status(ServeTreeResponse::INTERNAL_ERROR);
return ::grpc::Status::OK;
}
+ auto digest = ArtifactDigest{tree_id, 0, /*is_tree=*/true};
// check if tree is in Git cache
if (IsTreeInRepo(tree_id, StorageConfig::GitRoot(), logger_)) {
// upload tree to remote CAS
- auto digest = ArtifactDigest{tree_id, 0, /*is_tree=*/true};
auto repo = RepositoryConfig{};
if (not repo.SetGitCAS(StorageConfig::GitRoot())) {
auto str = fmt::format("Failed to SetGitCAS at {}",
@@ -853,7 +863,6 @@ auto SourceTreeService::ServeTree(
for (auto const& path : RemoteServeConfig::KnownRepositories()) {
if (IsTreeInRepo(tree_id, path, logger_)) {
// upload tree to remote CAS
- auto digest = ArtifactDigest{tree_id, 0, /*is_tree=*/true};
auto repo = RepositoryConfig{};
if (not repo.SetGitCAS(path)) {
auto str =
@@ -880,6 +889,17 @@ auto SourceTreeService::ServeTree(
return ::grpc::Status::OK;
}
}
+ // check also in the local CAS
+ if (local_api_->IsAvailable(digest) and
+ not local_api_->RetrieveToCas(
+ {Artifact::ObjectInfo{.digest = digest, .type = ObjectType::Tree}},
+ &(*remote_api_))) {
+ auto str =
+ fmt::format("Failed to sync tree {} from local CAS", tree_id);
+ logger_->Emit(LogLevel::Error, str);
+ response->set_status(ServeTreeResponse::SYNC_ERROR);
+ return ::grpc::Status::OK;
+ }
// tree not known
response->set_status(ServeTreeResponse::NOT_FOUND);
return ::grpc::Status::OK;