summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/buildtool/execution_api/remote/TARGETS1
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_api.cpp39
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_response.cpp69
3 files changed, 61 insertions, 48 deletions
diff --git a/src/buildtool/execution_api/remote/TARGETS b/src/buildtool/execution_api/remote/TARGETS
index 4bee7a7e..c3cedd7a 100644
--- a/src/buildtool/execution_api/remote/TARGETS
+++ b/src/buildtool/execution_api/remote/TARGETS
@@ -92,6 +92,7 @@
, ["src/buildtool/logging", "log_level"]
, ["src/buildtool/storage", "fs_utils"]
, ["src/buildtool/crypto", "hash_function"]
+ , ["src/buildtool/common", "artifact_digest_factory"]
]
}
, "config":
diff --git a/src/buildtool/execution_api/remote/bazel/bazel_api.cpp b/src/buildtool/execution_api/remote/bazel/bazel_api.cpp
index cb4ca14b..e36bf942 100644
--- a/src/buildtool/execution_api/remote/bazel/bazel_api.cpp
+++ b/src/buildtool/execution_api/remote/bazel/bazel_api.cpp
@@ -26,6 +26,8 @@
#include "fmt/core.h"
#include "src/buildtool/auth/authentication.hpp"
+#include "src/buildtool/common/artifact_digest.hpp"
+#include "src/buildtool/common/artifact_digest_factory.hpp"
#include "src/buildtool/common/bazel_types.hpp"
#include "src/buildtool/compatibility/compatibility.hpp"
#include "src/buildtool/execution_api/bazel_msg/bazel_blob_container.hpp"
@@ -170,7 +172,7 @@ namespace {
try {
blobs.reserve(container.Size());
for (const auto& blob : container.Blobs()) {
- blobs.emplace_back(static_cast<bazel_re::Digest>(blob.digest),
+ blobs.emplace_back(ArtifactDigestFactory::ToBazel(blob.digest),
blob.data,
blob.is_exec);
}
@@ -547,7 +549,7 @@ auto BazelApi::CreateAction(
[[nodiscard]] auto BazelApi::IsAvailable(
ArtifactDigest const& digest) const noexcept -> bool {
- return network_->IsAvailable(static_cast<bazel_re::Digest>(digest));
+ return network_->IsAvailable(ArtifactDigestFactory::ToBazel(digest));
}
[[nodiscard]] auto BazelApi::IsAvailable(
@@ -557,8 +559,8 @@ auto BazelApi::CreateAction(
bazel_digests.reserve(digests.size());
std::unordered_map<bazel_re::Digest, ArtifactDigest> digest_map;
for (auto const& digest : digests) {
- auto const& bazel_digest = static_cast<bazel_re::Digest>(digest);
- bazel_digests.push_back(bazel_digest);
+ auto const& bazel_digest =
+ bazel_digests.emplace_back(ArtifactDigestFactory::ToBazel(digest));
digest_map[bazel_digest] = digest;
}
auto bazel_result = network_->IsAvailable(bazel_digests);
@@ -572,17 +574,21 @@ auto BazelApi::CreateAction(
[[nodiscard]] auto BazelApi::SplitBlob(ArtifactDigest const& blob_digest)
const noexcept -> std::optional<std::vector<ArtifactDigest>> {
- auto chunk_digests =
- network_->SplitBlob(static_cast<bazel_re::Digest>(blob_digest));
+ auto const chunk_digests =
+ network_->SplitBlob(ArtifactDigestFactory::ToBazel(blob_digest));
if (not chunk_digests) {
return std::nullopt;
}
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}; });
+ for (auto const& chunk : *chunk_digests) {
+ auto part = ArtifactDigestFactory::FromBazel(
+ network_->GetHashFunction().GetType(), chunk);
+ if (not part) {
+ return std::nullopt;
+ }
+ artifact_digests.emplace_back(*std::move(part));
+ }
return artifact_digests;
}
@@ -600,14 +606,19 @@ auto BazelApi::CreateAction(
chunk_digests.cend(),
std::back_inserter(digests),
[](auto const& artifact_digest) {
- return static_cast<bazel_re::Digest>(artifact_digest);
+ return ArtifactDigestFactory::ToBazel(artifact_digest);
});
- auto digest = network_->SpliceBlob(
- static_cast<bazel_re::Digest>(blob_digest), digests);
+ auto const digest = network_->SpliceBlob(
+ ArtifactDigestFactory::ToBazel(blob_digest), digests);
if (not digest) {
return std::nullopt;
}
- return ArtifactDigest{*digest};
+ auto result = ArtifactDigestFactory::FromBazel(
+ network_->GetHashFunction().GetType(), *digest);
+ if (not result) {
+ return std::nullopt;
+ }
+ return *std::move(result);
}
[[nodiscard]] auto BazelApi::BlobSpliceSupport() const noexcept -> bool {
diff --git a/src/buildtool/execution_api/remote/bazel/bazel_response.cpp b/src/buildtool/execution_api/remote/bazel/bazel_response.cpp
index a5ac6ff1..ec76061c 100644
--- a/src/buildtool/execution_api/remote/bazel/bazel_response.cpp
+++ b/src/buildtool/execution_api/remote/bazel/bazel_response.cpp
@@ -15,11 +15,12 @@
#include "src/buildtool/execution_api/remote/bazel/bazel_response.hpp"
#include <cstddef>
+#include <functional>
#include "gsl/gsl"
+#include "src/buildtool/common/artifact_digest.hpp"
#include "src/buildtool/common/artifact_digest_factory.hpp"
#include "src/buildtool/common/bazel_digest_factory.hpp"
-#include "src/buildtool/compatibility/native_support.hpp"
#include "src/buildtool/crypto/hash_function.hpp"
#include "src/buildtool/execution_api/bazel_msg/bazel_blob_container.hpp"
#include "src/buildtool/execution_api/common/common_api.hpp"
@@ -32,7 +33,7 @@ namespace {
auto ProcessDirectoryMessage(HashFunction hash_function,
bazel_re::Directory const& dir) noexcept
- -> std::optional<BazelBlob> {
+ -> BazelBlob {
auto data = dir.SerializeAsString();
auto digest =
BazelDigestFactory::HashDataAs<ObjectType::File>(hash_function, data);
@@ -85,12 +86,18 @@ void BazelResponse::Populate() noexcept {
dir_symlinks.reserve(static_cast<std::size_t>(
action_result.output_directory_symlinks_size()));
+ auto const hash_type = network_->GetHashFunction().GetType();
// collect files and store them
for (auto const& file : action_result.output_files()) {
+ auto digest =
+ ArtifactDigestFactory::FromBazel(hash_type, file.digest());
+ if (not digest) {
+ return;
+ }
try {
artifacts.emplace(
file.path(),
- Artifact::ObjectInfo{.digest = ArtifactDigest{file.digest()},
+ Artifact::ObjectInfo{.digest = *std::move(digest),
.type = file.is_executable()
? ObjectType::Executable
: ObjectType::File});
@@ -131,13 +138,17 @@ void BazelResponse::Populate() noexcept {
if (not Compatibility::IsCompatible()) {
// in native mode: just collect and store tree digests
for (auto const& tree : action_result.output_directories()) {
- ExpectsAudit(NativeSupport::IsTree(tree.tree_digest().hash()));
+ auto digest =
+ ArtifactDigestFactory::FromBazel(hash_type, tree.tree_digest());
+ if (not digest) {
+ return;
+ }
+ ExpectsAudit(digest->IsTree());
try {
artifacts.emplace(
tree.path(),
- Artifact::ObjectInfo{
- .digest = ArtifactDigest{tree.tree_digest()},
- .type = ObjectType::Tree});
+ Artifact::ObjectInfo{.digest = *std::move(digest),
+ .type = ObjectType::Tree});
} catch (...) {
return;
}
@@ -174,6 +185,8 @@ void BazelResponse::Populate() noexcept {
// have to upload them manually.
auto root_digest = UploadTreeMessageDirectories(*tree);
if (not root_digest) {
+ Logger::Log(LogLevel::Error,
+ "uploading Tree's Directory messages failed");
return;
}
artifacts.emplace(
@@ -192,52 +205,40 @@ void BazelResponse::Populate() noexcept {
auto BazelResponse::UploadTreeMessageDirectories(
bazel_re::Tree const& tree) const -> std::optional<ArtifactDigest> {
+ auto const upload_callback =
+ [&network = *network_](BazelBlobContainer&& blobs) -> bool {
+ return network.UploadBlobs(std::move(blobs));
+ };
+ auto const hash_function = network_->GetHashFunction();
BazelBlobContainer dir_blobs{};
- auto rootdir_blob =
- ProcessDirectoryMessage(network_->GetHashFunction(), tree.root());
- if (not rootdir_blob) {
- return std::nullopt;
- }
- auto root_digest = rootdir_blob->digest;
+ auto rootdir_blob = ProcessDirectoryMessage(hash_function, tree.root());
+ auto const root_digest = rootdir_blob.digest;
// store or upload rootdir blob, taking maximum transfer size into account
if (not UpdateContainerAndUpload<bazel_re::Digest>(
&dir_blobs,
- std::move(*rootdir_blob),
+ std::move(rootdir_blob),
/*exception_is_fatal=*/false,
- [&network = network_](BazelBlobContainer&& blobs) {
- return network->UploadBlobs(std::move(blobs));
- })) {
- Logger::Log(LogLevel::Error,
- "uploading Tree's Directory messages failed");
+ upload_callback)) {
return std::nullopt;
}
for (auto const& subdir : tree.children()) {
- auto subdir_blob =
- ProcessDirectoryMessage(network_->GetHashFunction(), subdir);
- if (not subdir_blob) {
- return std::nullopt;
- }
// store or upload blob, taking maximum transfer size into account
if (not UpdateContainerAndUpload<bazel_re::Digest>(
&dir_blobs,
- std::move(*subdir_blob),
+ ProcessDirectoryMessage(hash_function, subdir),
/*exception_is_fatal=*/false,
- [&network = network_](BazelBlobContainer&& blobs) {
- return network->UploadBlobs(std::move(blobs));
- })) {
- Logger::Log(LogLevel::Error,
- "uploading Tree's Directory messages failed");
+ upload_callback)) {
return std::nullopt;
}
}
// upload any remaining blob
- if (not network_->UploadBlobs(std::move(dir_blobs))) {
- Logger::Log(LogLevel::Error,
- "uploading Tree's Directory messages failed");
+ if (not std::invoke(upload_callback, std::move(dir_blobs))) {
return std::nullopt;
}
- return ArtifactDigest{root_digest};
+ return ArtifactDigestFactory::FromBazel(hash_function.GetType(),
+ root_digest)
+ .value(); // must succeed all the time
}