summaryrefslogtreecommitdiff
path: root/src/buildtool/serve_api/serve_service/target.cpp
diff options
context:
space:
mode:
authorKlaus Aehlig <klaus.aehlig@huawei.com>2024-07-17 10:51:58 +0200
committerKlaus Aehlig <klaus.aehlig@huawei.com>2024-07-19 17:05:46 +0200
commit2296759242b9d057e356170973762b76d9644c6d (patch)
treea65e833dc50215a4c120f689f7ebef8cd86d2b0d /src/buildtool/serve_api/serve_service/target.cpp
parent31afb92d4e818e55ed6a12bdfe4def54f7e6c826 (diff)
downloadjustbuild-2296759242b9d057e356170973762b76d9644c6d.tar.gz
Take shared repo-gc lock wherever needed
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_)) {