summaryrefslogtreecommitdiff
path: root/src/buildtool/serve_api/serve_service/source_tree.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/source_tree.cpp
parent31afb92d4e818e55ed6a12bdfe4def54f7e6c826 (diff)
downloadjustbuild-2296759242b9d057e356170973762b76d9644c6d.tar.gz
Take shared repo-gc lock wherever needed
Diffstat (limited to 'src/buildtool/serve_api/serve_service/source_tree.cpp')
-rw-r--r--src/buildtool/serve_api/serve_service/source_tree.cpp52
1 files changed, 48 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 480dfd34..29e9ade2 100644
--- a/src/buildtool/serve_api/serve_service/source_tree.cpp
+++ b/src/buildtool/serve_api/serve_service/source_tree.cpp
@@ -32,6 +32,7 @@
#include "src/buildtool/multithreading/async_map_utils.hpp"
#include "src/buildtool/storage/fs_utils.hpp"
#include "src/buildtool/storage/garbage_collector.hpp"
+#include "src/buildtool/storage/repository_garbage_collector.hpp"
#include "src/utils/archive/archive_ops.hpp"
namespace {
@@ -197,6 +198,13 @@ auto SourceTreeService::ServeCommitTree(
::grpc::ServerContext* /* context */,
const ::justbuild::just_serve::ServeCommitTreeRequest* request,
ServeCommitTreeResponse* response) -> ::grpc::Status {
+ auto repo_lock = RepositoryGarbageCollector::SharedLock(storage_config_);
+ if (!repo_lock) {
+ logger_->Emit(LogLevel::Error, "Could not acquire repo gc SharedLock");
+ response->set_status(ServeCommitTreeResponse::INTERNAL_ERROR);
+ return ::grpc::Status::OK;
+ }
+
auto const& commit{request->commit()};
auto const& subdir{request->subdir()};
// try in local build root Git cache
@@ -704,6 +712,13 @@ auto SourceTreeService::ServeArchiveTree(
::grpc::ServerContext* /* context */,
const ::justbuild::just_serve::ServeArchiveTreeRequest* request,
ServeArchiveTreeResponse* response) -> ::grpc::Status {
+ auto repo_lock = RepositoryGarbageCollector::SharedLock(storage_config_);
+ if (!repo_lock) {
+ logger_->Emit(LogLevel::Error, "Could not acquire repo gc SharedLock");
+ response->set_status(ServeArchiveTreeResponse::INTERNAL_ERROR);
+ return ::grpc::Status::OK;
+ }
+
auto const& content{request->content()};
auto archive_type = ArchiveTypeToString(request->archive_type());
auto const& subdir{request->subdir()};
@@ -883,6 +898,13 @@ auto SourceTreeService::DistdirImportToGit(
content_list,
bool sync_tree,
ServeDistdirTreeResponse* response) -> ::grpc::Status {
+ auto repo_lock = RepositoryGarbageCollector::SharedLock(storage_config_);
+ if (!repo_lock) {
+ logger_->Emit(LogLevel::Error, "Could not acquire repo gc SharedLock");
+ response->set_status(ServeDistdirTreeResponse::INTERNAL_ERROR);
+ return ::grpc::Status::OK;
+ }
+
// create tmp directory for the distdir
auto distdir_tmp_dir = storage_config_.CreateTypedTmpDir("distdir");
if (not distdir_tmp_dir) {
@@ -1271,7 +1293,14 @@ auto SourceTreeService::ServeContent(
const ::justbuild::just_serve::ServeContentRequest* request,
ServeContentResponse* response) -> ::grpc::Status {
auto const& content{request->content()};
- // acquire lock for CAS
+ // acquire locks
+ auto repo_lock = RepositoryGarbageCollector::SharedLock(storage_config_);
+ if (!repo_lock) {
+ logger_->Emit(LogLevel::Error, "Could not acquire repo gc SharedLock");
+ response->set_status(ServeContentResponse::INTERNAL_ERROR);
+ return ::grpc::Status::OK;
+ }
+
auto lock = GarbageCollector::SharedLock(storage_config_);
if (!lock) {
logger_->Emit(LogLevel::Error, "Could not acquire gc SharedLock");
@@ -1380,7 +1409,14 @@ auto SourceTreeService::ServeTree(
const ::justbuild::just_serve::ServeTreeRequest* request,
ServeTreeResponse* response) -> ::grpc::Status {
auto const& tree_id{request->tree()};
- // acquire lock for CAS
+ // acquire locks
+ auto repo_lock = RepositoryGarbageCollector::SharedLock(storage_config_);
+ if (!repo_lock) {
+ logger_->Emit(LogLevel::Error, "Could not acquire repo gc SharedLock");
+ response->set_status(ServeTreeResponse::INTERNAL_ERROR);
+ return ::grpc::Status::OK;
+ }
+
auto lock = GarbageCollector::SharedLock(storage_config_);
if (!lock) {
logger_->Emit(LogLevel::Error, "Could not acquire gc SharedLock");
@@ -1513,7 +1549,14 @@ auto SourceTreeService::CheckRootTree(
const ::justbuild::just_serve::CheckRootTreeRequest* request,
CheckRootTreeResponse* response) -> ::grpc::Status {
auto const& tree_id{request->tree()};
- // acquire lock for CAS
+ // acquire locks
+ auto repo_lock = RepositoryGarbageCollector::SharedLock(storage_config_);
+ if (!repo_lock) {
+ logger_->Emit(LogLevel::Error, "Could not acquire repo gc SharedLock");
+ response->set_status(CheckRootTreeResponse::INTERNAL_ERROR);
+ return ::grpc::Status::OK;
+ }
+
auto lock = GarbageCollector::SharedLock(storage_config_);
if (!lock) {
logger_->Emit(LogLevel::Error, "Could not acquire gc SharedLock");
@@ -1614,13 +1657,14 @@ auto SourceTreeService::GetRemoteTree(
const ::justbuild::just_serve::GetRemoteTreeRequest* request,
GetRemoteTreeResponse* response) -> ::grpc::Status {
auto const& tree_id{request->tree()};
- // acquire lock for CAS
+ // acquire locks
auto lock = GarbageCollector::SharedLock(storage_config_);
if (!lock) {
logger_->Emit(LogLevel::Error, "Could not acquire gc SharedLock");
response->set_status(GetRemoteTreeResponse::INTERNAL_ERROR);
return ::grpc::Status::OK;
}
+
// get tree from remote CAS into tmp dir
auto digest = ArtifactDigest{tree_id, 0, /*is_tree=*/true};
if (not apis_.remote->IsAvailable(digest)) {