diff options
author | Paul Cristian Sarbu <paul.cristian.sarbu@huawei.com> | 2024-10-24 11:18:49 +0200 |
---|---|---|
committer | Paul Cristian Sarbu <paul.cristian.sarbu@huawei.com> | 2024-10-25 13:00:43 +0200 |
commit | 4018960c59d3fd0702c714e404ac913b2e83c3f5 (patch) | |
tree | 1de10348b25c7d6b9ea0f4de424b75f0cb7da11a /src/buildtool/serve_api/serve_service/source_tree.cpp | |
parent | 3d0003c7a61d77af534ef5d79a395849684518f7 (diff) | |
download | justbuild-4018960c59d3fd0702c714e404ac913b2e83c3f5.tar.gz |
serve service: Respond also with digest in serve repository tree RPCs
...besides the simple Git hash, if syncing was done. This way one
can know what digest to ask for from the remote. The serve client
also needs to now know what hash function the remote expects.
The serve service proto file is updated accordingly.
Diffstat (limited to 'src/buildtool/serve_api/serve_service/source_tree.cpp')
-rw-r--r-- | src/buildtool/serve_api/serve_service/source_tree.cpp | 106 |
1 files changed, 102 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 8bc06c39..a6514c46 100644 --- a/src/buildtool/serve_api/serve_service/source_tree.cpp +++ b/src/buildtool/serve_api/serve_service/source_tree.cpp @@ -214,14 +214,30 @@ auto SourceTreeService::ServeCommitTree( auto res = GetSubtreeFromCommit( native_context_->storage_config->GitRoot(), commit, subdir, logger_); if (res) { - auto tree_id = *std::move(res); + auto const tree_id = *std::move(res); auto status = ServeCommitTreeResponse::OK; if (request->sync_tree()) { status = SyncGitEntryToCas<ObjectType::Tree, ServeCommitTreeResponse>( tree_id, native_context_->storage_config->GitRoot()); + if (status == ServeCommitTreeResponse::OK) { + // set digest in response + auto digest = ArtifactDigestFactory::Create( + native_context_->storage_config->hash_function.GetType(), + tree_id, + /*size is unknown*/ 0, + /*is_tree=*/true); + if (not digest) { + logger_->Emit(LogLevel::Error, std::move(digest).error()); + response->set_status( + ServeCommitTreeResponse::INTERNAL_ERROR); + return ::grpc::Status::OK; + } + *(response->mutable_digest()) = + ArtifactDigestFactory::ToBazel(*std::move(digest)); + } } - *(response->mutable_tree()) = std::move(tree_id); + *(response->mutable_tree()) = tree_id; response->set_status(status); return ::grpc::Status::OK; } @@ -240,14 +256,32 @@ auto SourceTreeService::ServeCommitTree( for (auto const& path : serve_config_.known_repositories) { auto res = GetSubtreeFromCommit(path, commit, subdir, logger_); if (res) { - auto tree_id = *std::move(res); + auto const tree_id = *std::move(res); auto status = ServeCommitTreeResponse::OK; if (request->sync_tree()) { status = SyncGitEntryToCas<ObjectType::Tree, ServeCommitTreeResponse>(tree_id, path); + if (status == ServeCommitTreeResponse::OK) { + // set digest in response + auto digest = ArtifactDigestFactory::Create( + native_context_->storage_config->hash_function + .GetType(), + tree_id, + /*size is unknown*/ 0, + /*is_tree=*/true); + if (not digest) { + logger_->Emit(LogLevel::Error, + std::move(digest).error()); + response->set_status( + ServeCommitTreeResponse::INTERNAL_ERROR); + return ::grpc::Status::OK; + } + *(response->mutable_digest()) = + ArtifactDigestFactory::ToBazel(*std::move(digest)); + } } - *(response->mutable_tree()) = std::move(tree_id); + *(response->mutable_tree()) = tree_id; response->set_status(status); return ::grpc::Status::OK; } @@ -277,6 +311,21 @@ auto SourceTreeService::SyncArchive(std::string const& tree_id, if (sync_tree) { status = SyncGitEntryToCas<ObjectType::Tree, ServeArchiveTreeResponse>( tree_id, repo_path); + if (status == ServeArchiveTreeResponse::OK) { + // set digest in response + auto digest = ArtifactDigestFactory::Create( + native_context_->storage_config->hash_function.GetType(), + tree_id, + /*size is unknown*/ 0, + /*is_tree=*/true); + if (not digest) { + logger_->Emit(LogLevel::Error, std::move(digest).error()); + response->set_status(ServeArchiveTreeResponse::INTERNAL_ERROR); + return ::grpc::Status::OK; + } + *(response->mutable_digest()) = + ArtifactDigestFactory::ToBazel(*std::move(digest)); + } } *(response->mutable_tree()) = tree_id; response->set_status(status); @@ -992,6 +1041,21 @@ auto SourceTreeService::DistdirImportToGit( if (sync_tree) { status = SyncGitEntryToCas<ObjectType::Tree, ServeDistdirTreeResponse>( tree_id, native_context_->storage_config->GitRoot()); + if (status == ServeDistdirTreeResponse::OK) { + // set digest in response + auto digest = ArtifactDigestFactory::Create( + native_context_->storage_config->hash_function.GetType(), + tree_id, + /*size is unknown*/ 0, + /*is_tree=*/true); + if (not digest) { + logger_->Emit(LogLevel::Error, std::move(digest).error()); + response->set_status(ServeDistdirTreeResponse::INTERNAL_ERROR); + return ::grpc::Status::OK; + } + *(response->mutable_digest()) = + ArtifactDigestFactory::ToBazel(*std::move(digest)); + } } // set response on success *(response->mutable_tree()) = std::move(tree_id); @@ -1200,6 +1264,22 @@ auto SourceTreeService::ServeDistdirTree( status = SyncGitEntryToCas<ObjectType::Tree, ServeDistdirTreeResponse>( tree_id, native_context_->storage_config->GitRoot()); + if (status == ServeDistdirTreeResponse::OK) { + // set digest in response + auto digest = ArtifactDigestFactory::Create( + native_context_->storage_config->hash_function.GetType(), + tree_id, + /*size is unknown*/ 0, + /*is_tree=*/true); + if (not digest) { + logger_->Emit(LogLevel::Error, std::move(digest).error()); + response->set_status( + ServeDistdirTreeResponse::INTERNAL_ERROR); + return ::grpc::Status::OK; + } + *(response->mutable_digest()) = + ArtifactDigestFactory::ToBazel(*std::move(digest)); + } } // set response on success *(response->mutable_tree()) = std::move(tree_id); @@ -1224,6 +1304,24 @@ auto SourceTreeService::ServeDistdirTree( status = SyncGitEntryToCas<ObjectType::Tree, ServeDistdirTreeResponse>(tree_id, path); + if (status == ServeDistdirTreeResponse::OK) { + // set digest in response + auto digest = ArtifactDigestFactory::Create( + native_context_->storage_config->hash_function + .GetType(), + tree_id, + /*size is unknown*/ 0, + /*is_tree=*/true); + if (not digest) { + logger_->Emit(LogLevel::Error, + std::move(digest).error()); + response->set_status( + ServeDistdirTreeResponse::INTERNAL_ERROR); + return ::grpc::Status::OK; + } + *(response->mutable_digest()) = + ArtifactDigestFactory::ToBazel(*std::move(digest)); + } } // set response on success *(response->mutable_tree()) = std::move(tree_id); |