summaryrefslogtreecommitdiff
path: root/src/buildtool/serve_api/serve_service/source_tree.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/buildtool/serve_api/serve_service/source_tree.cpp')
-rw-r--r--src/buildtool/serve_api/serve_service/source_tree.cpp92
1 files changed, 84 insertions, 8 deletions
diff --git a/src/buildtool/serve_api/serve_service/source_tree.cpp b/src/buildtool/serve_api/serve_service/source_tree.cpp
index 9fb2dae4..2272cac9 100644
--- a/src/buildtool/serve_api/serve_service/source_tree.cpp
+++ b/src/buildtool/serve_api/serve_service/source_tree.cpp
@@ -97,6 +97,24 @@ auto SymlinksResolveToPragmaSpecial(
} // namespace
+auto SourceTreeService::EnsureGitCacheRoot()
+ -> expected<std::monostate, std::string> {
+ // make sure the git root directory is properly initialized
+ if (not FileSystemManager::CreateDirectory(
+ native_context_->storage_config->GitRoot())) {
+ return unexpected{
+ fmt::format("Could not create Git cache root {}",
+ native_context_->storage_config->GitRoot().string())};
+ }
+ if (not GitRepo::InitAndOpen(native_context_->storage_config->GitRoot(),
+ true)) {
+ return unexpected{
+ fmt::format("Could not initialize Git cache repository {}",
+ native_context_->storage_config->GitRoot().string())};
+ }
+ return std::monostate{};
+}
+
auto SourceTreeService::GetSubtreeFromCommit(
std::filesystem::path const& repo_path,
std::string const& commit,
@@ -200,6 +218,13 @@ auto SourceTreeService::ServeCommitTree(
::grpc::ServerContext* /* context */,
const ::justbuild::just_serve::ServeCommitTreeRequest* request,
ServeCommitTreeResponse* response) -> ::grpc::Status {
+ // ensure Git cache exists
+ if (auto done = EnsureGitCacheRoot(); not done) {
+ logger_->Emit(LogLevel::Error, std::move(done).error());
+ response->set_status(ServeCommitTreeResponse::INTERNAL_ERROR);
+ return ::grpc::Status::OK;
+ }
+ // get lock for Git cache
auto repo_lock = RepositoryGarbageCollector::SharedLock(
*native_context_->storage_config);
if (not repo_lock) {
@@ -800,6 +825,13 @@ auto SourceTreeService::ServeArchiveTree(
::grpc::ServerContext* /* context */,
const ::justbuild::just_serve::ServeArchiveTreeRequest* request,
ServeArchiveTreeResponse* response) -> ::grpc::Status {
+ // ensure Git cache exists
+ if (auto done = EnsureGitCacheRoot(); not done) {
+ logger_->Emit(LogLevel::Error, std::move(done).error());
+ response->set_status(ServeArchiveTreeResponse::INTERNAL_ERROR);
+ return ::grpc::Status::OK;
+ }
+ // get gc lock for Git cache
auto repo_lock = RepositoryGarbageCollector::SharedLock(
*native_context_->storage_config);
if (not repo_lock) {
@@ -1002,14 +1034,6 @@ auto SourceTreeService::DistdirImportToGit(
content_list,
bool sync_tree,
ServeDistdirTreeResponse* response) -> ::grpc::Status {
- auto repo_lock = RepositoryGarbageCollector::SharedLock(
- *native_context_->storage_config);
- if (not 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 =
native_context_->storage_config->CreateTypedTmpDir("distdir");
@@ -1092,6 +1116,20 @@ auto SourceTreeService::ServeDistdirTree(
::grpc::ServerContext* /* context */,
const ::justbuild::just_serve::ServeDistdirTreeRequest* request,
ServeDistdirTreeResponse* response) -> ::grpc::Status {
+ // ensure Git cache exists
+ if (auto done = EnsureGitCacheRoot(); not done) {
+ logger_->Emit(LogLevel::Error, std::move(done).error());
+ response->set_status(ServeDistdirTreeResponse::INTERNAL_ERROR);
+ return ::grpc::Status::OK;
+ }
+ // get gc lock for Git cache
+ auto repo_lock = RepositoryGarbageCollector::SharedLock(
+ *native_context_->storage_config);
+ if (not repo_lock) {
+ logger_->Emit(LogLevel::Error, "Could not acquire repo gc SharedLock");
+ response->set_status(ServeDistdirTreeResponse::INTERNAL_ERROR);
+ return ::grpc::Status::OK;
+ }
// acquire lock for native CAS
auto lock = GarbageCollector::SharedLock(*native_context_->storage_config);
if (not lock) {
@@ -1339,6 +1377,13 @@ auto SourceTreeService::ServeContent(
ServeContentResponse* response) -> ::grpc::Status {
auto const& content{request->content()};
+ // ensure Git cache exists
+ if (auto done = EnsureGitCacheRoot(); not done) {
+ logger_->Emit(LogLevel::Error, std::move(done).error());
+ response->set_status(ServeContentResponse::INTERNAL_ERROR);
+ return ::grpc::Status::OK;
+ }
+
// acquire locks
auto repo_lock = RepositoryGarbageCollector::SharedLock(
*native_context_->storage_config);
@@ -1441,6 +1486,13 @@ auto SourceTreeService::ServeTree(
ServeTreeResponse* response) -> ::grpc::Status {
auto const& tree_id{request->tree()};
+ // ensure Git cache exists
+ if (auto done = EnsureGitCacheRoot(); not done) {
+ logger_->Emit(LogLevel::Error, std::move(done).error());
+ response->set_status(ServeTreeResponse::INTERNAL_ERROR);
+ return ::grpc::Status::OK;
+ }
+
// acquire locks
auto repo_lock = RepositoryGarbageCollector::SharedLock(
*native_context_->storage_config);
@@ -1542,6 +1594,14 @@ auto SourceTreeService::CheckRootTree(
const ::justbuild::just_serve::CheckRootTreeRequest* request,
CheckRootTreeResponse* response) -> ::grpc::Status {
auto const& tree_id{request->tree()};
+
+ // ensure Git cache exists
+ if (auto done = EnsureGitCacheRoot(); not done) {
+ logger_->Emit(LogLevel::Error, std::move(done).error());
+ response->set_status(CheckRootTreeResponse::INTERNAL_ERROR);
+ return ::grpc::Status::OK;
+ }
+
// acquire locks
auto repo_lock = RepositoryGarbageCollector::SharedLock(
*native_context_->storage_config);
@@ -1662,7 +1722,23 @@ auto SourceTreeService::GetRemoteTree(
::grpc::ServerContext* /* context */,
const ::justbuild::just_serve::GetRemoteTreeRequest* request,
GetRemoteTreeResponse* response) -> ::grpc::Status {
+
+ // ensure Git cache exists
+ if (auto done = EnsureGitCacheRoot(); not done) {
+ logger_->Emit(LogLevel::Error, std::move(done).error());
+ response->set_status(GetRemoteTreeResponse::INTERNAL_ERROR);
+ return ::grpc::Status::OK;
+ }
+
// acquire locks
+ auto repo_lock = RepositoryGarbageCollector::SharedLock(
+ *native_context_->storage_config);
+ if (not repo_lock) {
+ logger_->Emit(LogLevel::Error, "Could not acquire repo gc SharedLock");
+ response->set_status(GetRemoteTreeResponse::INTERNAL_ERROR);
+ return ::grpc::Status::OK;
+ }
+
auto lock = GarbageCollector::SharedLock(*native_context_->storage_config);
if (not lock) {
logger_->Emit(LogLevel::Error, "Could not acquire gc SharedLock");