summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKlaus Aehlig <klaus.aehlig@huawei.com>2025-03-18 10:45:46 +0100
committerKlaus Aehlig <klaus.aehlig@huawei.com>2025-03-18 11:00:46 +0100
commit360ddbb0285554c936d5eaa95460d5aad3e13b1e (patch)
tree92c177470cd27c62af58ef7fbdfbd533f6d4b8e8
parent804a0d4eed9aafeb8ddd7e19ff8b618009d3cef9 (diff)
downloadjustbuild-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.cpp20
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;