From 360ddbb0285554c936d5eaa95460d5aad3e13b1e Mon Sep 17 00:00:00 2001 From: Klaus Aehlig Date: Tue, 18 Mar 2025 10:45:46 +0100 Subject: 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. --- .../serve_api/serve_service/source_tree.cpp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) (limited to 'src/buildtool/serve_api/serve_service/source_tree.cpp') 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; -- cgit v1.2.3