summaryrefslogtreecommitdiff
path: root/src/buildtool/serve_api/serve_service/target.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/buildtool/serve_api/serve_service/target.cpp')
-rw-r--r--src/buildtool/serve_api/serve_service/target.cpp19
1 files changed, 17 insertions, 2 deletions
diff --git a/src/buildtool/serve_api/serve_service/target.cpp b/src/buildtool/serve_api/serve_service/target.cpp
index 45c78946..c2dd3344 100644
--- a/src/buildtool/serve_api/serve_service/target.cpp
+++ b/src/buildtool/serve_api/serve_service/target.cpp
@@ -43,6 +43,7 @@
#include "src/buildtool/serve_api/serve_service/target_utils.hpp"
#include "src/buildtool/storage/backend_description.hpp"
#include "src/buildtool/storage/garbage_collector.hpp"
+#include "src/buildtool/storage/repository_garbage_collector.hpp"
#include "src/buildtool/storage/target_cache_key.hpp"
#include "src/utils/cpp/verify_hash.hpp"
@@ -130,10 +131,16 @@ auto TargetService::ServeTarget(
auto const& target_cache_key_digest =
ArtifactDigest{request->target_cache_key_id()};
- // acquire lock for CAS
+ // acquire locks
+ auto repo_lock = RepositoryGarbageCollector::SharedLock(storage_config_);
+ if (!repo_lock) {
+ auto msg = std::string("Could not acquire repo gc SharedLock");
+ logger_->Emit(LogLevel::Error, msg);
+ return ::grpc::Status{::grpc::StatusCode::INTERNAL, msg};
+ }
auto lock = GarbageCollector::SharedLock(storage_config_);
if (!lock) {
- auto msg = std::string("Could not acquire gc SharedLock");
+ auto msg = std::string("Could not acquire CAS gc SharedLock");
logger_->Emit(LogLevel::Error, msg);
return ::grpc::Status{::grpc::StatusCode::INTERNAL, msg};
}
@@ -728,6 +735,14 @@ auto TargetService::ServeTargetDescription(
// retrieve content of target file
std::optional<std::string> target_file_content{std::nullopt};
bool tree_found{false};
+ // Get repository lock before inspecting the root git cache
+ auto repo_lock = RepositoryGarbageCollector::SharedLock(storage_config_);
+ if (!repo_lock) {
+ auto msg = std::string("Could not acquire repo gc SharedLock");
+ logger_->Emit(LogLevel::Error, msg);
+ return ::grpc::Status{::grpc::StatusCode::INTERNAL, msg};
+ }
+
// try in local build root Git cache
if (auto res = GetBlobContent(
storage_config_.GitRoot(), root_tree, target_file, logger_)) {