diff options
author | Sascha Roloff <sascha.roloff@huawei.com> | 2024-02-23 16:14:12 +0100 |
---|---|---|
committer | Sascha Roloff <sascha.roloff@huawei.com> | 2024-02-26 17:16:21 +0100 |
commit | 5a7cd2ae7aadfd754018fcd0b20adcbc3f368f1d (patch) | |
tree | be7a069b4839b9b94aaa835d52f2c7211601ed70 | |
parent | df8c8411e208fd84c0084cf92a093c3f08c07d02 (diff) | |
download | justbuild-5a7cd2ae7aadfd754018fcd0b20adcbc3f368f1d.tar.gz |
Implement blob splitting in local API
-rw-r--r-- | src/buildtool/execution_api/local/local_api.hpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/buildtool/execution_api/local/local_api.hpp b/src/buildtool/execution_api/local/local_api.hpp index 3c063a84..bdf0e790 100644 --- a/src/buildtool/execution_api/local/local_api.hpp +++ b/src/buildtool/execution_api/local/local_api.hpp @@ -459,6 +459,44 @@ class LocalApi final : public IExecutionApi { return result; } + [[nodiscard]] auto SplitBlob(ArtifactDigest const& blob_digest) + const noexcept -> std::optional<std::vector<ArtifactDigest>> final { + Logger::Log(LogLevel::Debug, "SplitBlob({})", blob_digest.hash()); + auto split_result = CASUtils::SplitBlobFastCDC( + static_cast<bazel_re::Digest>(blob_digest), *storage_); + if (std::holds_alternative<grpc::Status>(split_result)) { + auto* status = std::get_if<grpc::Status>(&split_result); + Logger::Log(LogLevel::Error, status->error_message()); + return std::nullopt; + } + auto* chunk_digests = + std::get_if<std::vector<bazel_re::Digest>>(&split_result); + Logger::Log(LogLevel::Debug, [&blob_digest, &chunk_digests]() { + std::stringstream ss{}; + ss << "Split blob " << blob_digest.hash() << ":" + << blob_digest.size() << " into " << chunk_digests->size() + << " chunks: [ "; + for (auto const& chunk_digest : *chunk_digests) { + ss << chunk_digest.hash() << ":" << chunk_digest.size_bytes() + << " "; + } + ss << "]"; + return ss.str(); + }); + auto artifact_digests = std::vector<ArtifactDigest>{}; + 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}; }); + return artifact_digests; + } + + [[nodiscard]] auto BlobSplitSupport() const noexcept -> bool final { + return true; + } + [[nodiscard]] auto SpliceBlob( ArtifactDigest const& blob_digest, std::vector<ArtifactDigest> const& chunk_digests) const noexcept |