summaryrefslogtreecommitdiff
path: root/src/buildtool/serve_api/serve_service/source_tree.cpp
diff options
context:
space:
mode:
authorMaksim Denisov <denisov.maksim@huawei.com>2025-01-14 13:05:19 +0100
committerMaksim Denisov <denisov.maksim@huawei.com>2025-01-21 09:58:36 +0100
commit7321beb731e5f09584baaf77554cbfe1c470742f (patch)
tree99e590b9b85951ae30324f88bc13133baf6de6eb /src/buildtool/serve_api/serve_service/source_tree.cpp
parentc326095d4201bea74bbe7ebfffb8a58de3b20bba (diff)
downloadjustbuild-7321beb731e5f09584baaf77554cbfe1c470742f.tar.gz
TreeStructure: Compute on serve
Diffstat (limited to 'src/buildtool/serve_api/serve_service/source_tree.cpp')
-rw-r--r--src/buildtool/serve_api/serve_service/source_tree.cpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/buildtool/serve_api/serve_service/source_tree.cpp b/src/buildtool/serve_api/serve_service/source_tree.cpp
index ff12baee..8a45365d 100644
--- a/src/buildtool/serve_api/serve_service/source_tree.cpp
+++ b/src/buildtool/serve_api/serve_service/source_tree.cpp
@@ -44,6 +44,7 @@
#include "src/buildtool/storage/garbage_collector.hpp"
#include "src/buildtool/storage/repository_garbage_collector.hpp"
#include "src/buildtool/storage/storage.hpp"
+#include "src/buildtool/tree_structure/tree_structure_utils.hpp"
#include "src/utils/archive/archive_ops.hpp"
#include "src/utils/cpp/expected.hpp"
#include "src/utils/cpp/file_locking.hpp"
@@ -1669,4 +1670,70 @@ auto SourceTreeService::GetRemoteTree(
return ::grpc::Status::OK;
}
+auto SourceTreeService::ComputeTreeStructure(
+ ::grpc::ServerContext* /*context*/,
+ const ::justbuild::just_serve::ComputeTreeStructureRequest* request,
+ ComputeTreeStructureResponse* 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(ComputeTreeStructureResponse::INTERNAL_ERROR);
+ return ::grpc::Status::OK;
+ }
+ // ensure Git cache exists
+ if (auto done = EnsureGitCacheRoot(); not done) {
+ logger_->Emit(LogLevel::Error, std::move(done).error());
+ response->set_status(ComputeTreeStructureResponse::INTERNAL_ERROR);
+ return ::grpc::Status::OK;
+ }
+ // get gc lock for native storage
+ auto lock = GarbageCollector::SharedLock(*native_context_->storage_config);
+ if (not lock) {
+ logger_->Emit(LogLevel::Error, "Could not acquire gc SharedLock");
+ response->set_status(ComputeTreeStructureResponse::INTERNAL_ERROR);
+ return ::grpc::Status::OK;
+ }
+
+ auto const tree_digest =
+ ArtifactDigestFactory::Create(HashFunction::Type::GitSHA1,
+ request->tree(),
+ /*size_unknown=*/0,
+ /*is_tree=*/true);
+ if (not tree_digest) {
+ logger_->Emit(LogLevel::Error, tree_digest.error());
+ response->set_status(ComputeTreeStructureResponse::INTERNAL_ERROR);
+ return ::grpc::Status::OK;
+ }
+
+ auto known_repositories = serve_config_.known_repositories;
+ known_repositories.push_back(native_context_->storage_config->GitRoot());
+
+ std::optional<ArtifactDigest> tree_structure;
+ if (auto from_local = TreeStructureUtils::ComputeStructureLocally(
+ *tree_digest,
+ known_repositories,
+ *native_context_->storage_config,
+ &mutex_)) {
+ tree_structure = std::move(from_local).value();
+ }
+ else {
+ // A critical error occurred:
+ logger_->Emit(LogLevel::Error, std::move(from_local).error());
+ response->set_status(ComputeTreeStructureResponse::INTERNAL_ERROR);
+ return ::grpc::Status::OK;
+ }
+
+ if (not tree_structure.has_value()) {
+ logger_->Emit(
+ LogLevel::Error, "Failed to find {}", tree_digest->hash());
+ response->set_status(ComputeTreeStructureResponse::NOT_FOUND);
+ return ::grpc::Status::OK;
+ }
+
+ response->set_tree_structure_hash(tree_structure->hash());
+ response->set_status(ComputeTreeStructureResponse::OK);
+ return ::grpc::Status::OK;
+}
+
#endif // BOOTSTRAP_BUILD_TOOL