From 454d885f0ef461ccc6b04689726d3261ffff0597 Mon Sep 17 00:00:00 2001 From: Paul Cristian Sarbu Date: Tue, 21 May 2024 11:23:26 +0200 Subject: bazel_api: Remove extra complexity in RetrieveToCasSplitted We can avoid doing extra work in converting between bazel digests and artifact digests by actually using the API interface. --- .../execution_api/remote/bazel/bazel_api.cpp | 68 +++++++++------------- 1 file changed, 29 insertions(+), 39 deletions(-) (limited to 'src/buildtool/execution_api/remote/bazel/bazel_api.cpp') diff --git a/src/buildtool/execution_api/remote/bazel/bazel_api.cpp b/src/buildtool/execution_api/remote/bazel/bazel_api.cpp index e278d6a5..4ae8b3d8 100644 --- a/src/buildtool/execution_api/remote/bazel/bazel_api.cpp +++ b/src/buildtool/execution_api/remote/bazel/bazel_api.cpp @@ -45,24 +45,6 @@ namespace { -[[nodiscard]] auto IsAvailable( - std::vector const& digests, - gsl::not_null const& api) noexcept - -> std::vector { - std::vector artifact_digests; - artifact_digests.reserve(digests.size()); - for (auto const& digest : digests) { - artifact_digests.emplace_back(digest); - } - auto const& missing_artifact_digests = api->IsAvailable(artifact_digests); - std::vector missing_digests; - missing_digests.reserve(missing_artifact_digests.size()); - for (auto const& digest : missing_artifact_digests) { - missing_digests.emplace_back(static_cast(digest)); - } - return missing_digests; -} - [[nodiscard]] auto RetrieveToCas( std::vector const& digests, gsl::not_null const& api, @@ -110,53 +92,61 @@ namespace { [[nodiscard]] auto RetrieveToCasSplitted( Artifact::ObjectInfo const& artifact_info, - gsl::not_null const& api, + gsl::not_null const& this_api, + gsl::not_null const& other_api, std::shared_ptr const& network, std::unordered_map const& info_map) noexcept -> bool { // Split blob into chunks at the remote side and retrieve chunk digests. - auto chunk_digests = network->SplitBlob(artifact_info.digest); + auto chunk_digests = this_api->SplitBlob(artifact_info.digest); if (not chunk_digests) { // If blob splitting failed, fall back to regular fetching. - return ::RetrieveToCas({artifact_info.digest}, api, network, info_map); + return ::RetrieveToCas( + {artifact_info.digest}, other_api, network, info_map); } // Fetch unknown chunks. - auto digest_set = std::unordered_set{ - chunk_digests->begin(), chunk_digests->end()}; + auto digest_set = std::unordered_set{chunk_digests->begin(), + chunk_digests->end()}; auto unique_digests = - std::vector{digest_set.begin(), digest_set.end()}; - auto missing_digests = ::IsAvailable(unique_digests, api); - if (not ::RetrieveToCas(missing_digests, api, network, info_map)) { + std::vector{digest_set.begin(), digest_set.end()}; + + auto missing_artifact_digests = other_api->IsAvailable(unique_digests); + + auto missing_digests = std::vector{}; + missing_digests.reserve(digest_set.size()); + std::transform(missing_artifact_digests.begin(), + missing_artifact_digests.end(), + std::back_inserter(missing_digests), + [](auto const& digest) { + return static_cast(digest); + }); + if (not ::RetrieveToCas(missing_digests, other_api, network, info_map)) { return false; } // Assemble blob from chunks. - auto artifact_digests = std::vector{}; - artifact_digests.reserve(chunk_digests->size()); - std::transform(chunk_digests->cbegin(), - chunk_digests->cend(), - std::back_inserter(artifact_digests), - [](auto const& digest) { return ArtifactDigest{digest}; }); - auto digest = api->SpliceBlob(artifact_info.digest, artifact_digests); + auto digest = other_api->SpliceBlob(artifact_info.digest, *chunk_digests); if (not digest) { // If blob splicing failed, fall back to regular fetching. - return ::RetrieveToCas({artifact_info.digest}, api, network, info_map); + return ::RetrieveToCas( + {artifact_info.digest}, other_api, network, info_map); } Logger::Log( LogLevel::Debug, [&artifact_info, &unique_digests, - &missing_digests, + &missing_artifact_digests, total_size = digest->size()]() { - auto missing_digest_set = std::unordered_set{ - missing_digests.begin(), missing_digests.end()}; + auto missing_digest_set = std::unordered_set{ + missing_artifact_digests.begin(), + missing_artifact_digests.end()}; std::uint64_t transmitted_bytes{0}; for (auto const& chunk_digest : unique_digests) { if (missing_digest_set.contains(chunk_digest)) { - transmitted_bytes += chunk_digest.size_bytes(); + transmitted_bytes += chunk_digest.size(); } } double transmission_factor = @@ -412,7 +402,7 @@ auto BazelApi::CreateAction( if (use_blob_splitting and network_->BlobSplitSupport() and api->BlobSpliceSupport() ? ::RetrieveToCasSplitted( - info, api, network_, info_map) + info, this, api, network_, info_map) : ::RetrieveToCas( {info.digest}, api, network_, info_map)) { return; -- cgit v1.2.3