diff options
author | Klaus Aehlig <klaus.aehlig@huawei.com> | 2025-03-18 10:45:46 +0100 |
---|---|---|
committer | Klaus Aehlig <klaus.aehlig@huawei.com> | 2025-03-18 11:00:46 +0100 |
commit | 360ddbb0285554c936d5eaa95460d5aad3e13b1e (patch) | |
tree | 92c177470cd27c62af58ef7fbdfbd533f6d4b8e8 | |
parent | 804a0d4eed9aafeb8ddd7e19ff8b618009d3cef9 (diff) | |
download | justbuild-360ddbb0285554c936d5eaa95460d5aad3e13b1e.tar.gz |
serve service: receive trees in parallel in local CAS
The serve service can be asked to get a tree root from the designated
remote-execution endpoint. Speed this process up by going through local
CAS; in this way,
- identical blobs are fetched only once, and
- the fetching happens in parallel.
-rw-r--r-- | src/buildtool/serve_api/serve_service/source_tree.cpp | 20 |
1 files changed, 16 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 0108d8d7..02007e1e 100644 --- a/src/buildtool/serve_api/serve_service/source_tree.cpp +++ b/src/buildtool/serve_api/serve_service/source_tree.cpp @@ -1637,13 +1637,25 @@ auto SourceTreeService::GetRemoteTree( response->set_status(GetRemoteTreeResponse::INTERNAL_ERROR); return ::grpc::Status::OK; } - if (not apis_.remote->RetrieveToPaths( + if (not apis_.remote->ParallelRetrieveToCas( {Artifact::ObjectInfo{.digest = *remote_digest, .type = ObjectType::Tree}}, - {tmp_dir->GetPath()}, - &(*apis_.local))) { + *apis_.local, + serve_config_.jobs, + true)) { + logger_->Emit( + LogLevel::Error, + "Failed to parallel retrieve tree {} from remote CAS to local CAS", + remote_digest->hash()); + response->set_status(GetRemoteTreeResponse::FAILED_PRECONDITION); + return ::grpc::Status::OK; + } + if (not apis_.local->RetrieveToPaths( + {Artifact::ObjectInfo{.digest = *remote_digest, + .type = ObjectType::Tree}}, + {tmp_dir->GetPath()})) { logger_->Emit(LogLevel::Error, - "Failed to retrieve tree {} from remote CAS", + "Failed to install tree {} from local CAS", remote_digest->hash()); response->set_status(GetRemoteTreeResponse::FAILED_PRECONDITION); return ::grpc::Status::OK; |