diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/buildtool/execution_api/bazel_msg/bazel_msg_factory.cpp | 37 | ||||
-rw-r--r-- | src/buildtool/execution_api/common/TARGETS | 3 | ||||
-rw-r--r-- | src/buildtool/execution_api/common/blob_tree.cpp | 19 | ||||
-rw-r--r-- | src/buildtool/execution_api/git/git_api.cpp | 15 | ||||
-rw-r--r-- | src/buildtool/execution_api/local/local_api.cpp | 22 | ||||
-rw-r--r-- | src/buildtool/execution_api/remote/TARGETS | 2 | ||||
-rw-r--r-- | src/buildtool/execution_api/remote/bazel/bazel_cas_client.cpp | 18 | ||||
-rw-r--r-- | src/buildtool/execution_api/remote/bazel/bazel_response.cpp | 8 | ||||
-rw-r--r-- | src/buildtool/execution_api/remote/bazel/bytestream_client.hpp | 12 | ||||
-rw-r--r-- | src/buildtool/execution_engine/executor/executor.hpp | 35 | ||||
-rw-r--r-- | src/buildtool/graph_traverser/TARGETS | 2 | ||||
-rw-r--r-- | src/buildtool/graph_traverser/graph_traverser.hpp | 22 |
12 files changed, 108 insertions, 87 deletions
diff --git a/src/buildtool/execution_api/bazel_msg/bazel_msg_factory.cpp b/src/buildtool/execution_api/bazel_msg/bazel_msg_factory.cpp index 6eb35e4c..ccc0f2d7 100644 --- a/src/buildtool/execution_api/bazel_msg/bazel_msg_factory.cpp +++ b/src/buildtool/execution_api/bazel_msg/bazel_msg_factory.cpp @@ -164,13 +164,14 @@ struct DirectoryNodeBundle final { // SHA256 is used since bazel types are processed here. HashFunction const hash_function{HashFunction::Type::PlainSHA256}; - auto digest = ArtifactDigestFactory::HashDataAs<ObjectType::File>( - hash_function, *content); - - return DirectoryNodeBundle{ - .message = CreateDirectoryNode(dir_name, digest), - .blob = ArtifactBlob{ - std::move(digest), std::move(*content), /*is_exec=*/false}}; + auto blob = ArtifactBlob::FromMemory( + hash_function, ObjectType::File, *std::move(content)); + if (not blob.has_value()) { + return std::nullopt; + } + auto const digest = blob->GetDigest(); + return DirectoryNodeBundle{.message = CreateDirectoryNode(dir_name, digest), + .blob = *std::move(blob)}; } /// \brief Create bundle for protobuf message Command from args strings. @@ -201,11 +202,12 @@ struct DirectoryNodeBundle final { if (not content) { return std::nullopt; } - auto digest = ArtifactDigestFactory::HashDataAs<ObjectType::File>( - request.hash_function, *content); - return ArtifactBlob{std::move(digest), - std::move(*content), - /*is_exec=*/false}; + auto blob = ArtifactBlob::FromMemory( + request.hash_function, ObjectType::File, *std::move(content)); + if (not blob.has_value()) { + return std::nullopt; + } + return *std::move(blob); } /// \brief Create bundle for protobuf message Action from Command. @@ -240,11 +242,12 @@ struct DirectoryNodeBundle final { if (not content) { return std::nullopt; } - auto digest = ArtifactDigestFactory::HashDataAs<ObjectType::File>( - request.hash_function, *content); - return ArtifactBlob{std::move(digest), - std::move(*content), - /*is_exec=*/false}; + auto blob = ArtifactBlob::FromMemory( + request.hash_function, ObjectType::File, *std::move(content)); + if (not blob.has_value()) { + return std::nullopt; + } + return *std::move(blob); } /// \brief Convert `DirectoryTree` to `DirectoryNodeBundle`. diff --git a/src/buildtool/execution_api/common/TARGETS b/src/buildtool/execution_api/common/TARGETS index 6eeb3931..39ccc042 100644 --- a/src/buildtool/execution_api/common/TARGETS +++ b/src/buildtool/execution_api/common/TARGETS @@ -133,8 +133,7 @@ , ["src/buildtool/execution_api/bazel_msg", "directory_tree"] ] , "private-deps": - [ ["src/buildtool/common", "artifact_digest_factory"] - , ["src/buildtool/common", "common"] + [ ["src/buildtool/common", "common"] , ["src/buildtool/crypto", "hash_function"] , ["src/buildtool/file_system", "git_repo"] , ["src/buildtool/file_system", "object_type"] diff --git a/src/buildtool/execution_api/common/blob_tree.cpp b/src/buildtool/execution_api/common/blob_tree.cpp index 7224406a..e6d8fc2c 100644 --- a/src/buildtool/execution_api/common/blob_tree.cpp +++ b/src/buildtool/execution_api/common/blob_tree.cpp @@ -22,7 +22,6 @@ #include "src/buildtool/common/artifact.hpp" #include "src/buildtool/common/artifact_digest.hpp" -#include "src/buildtool/common/artifact_digest_factory.hpp" #include "src/buildtool/crypto/hash_function.hpp" #include "src/buildtool/file_system/git_repo.hpp" #include "src/buildtool/file_system/object_type.hpp" @@ -68,17 +67,13 @@ auto BlobTree::FromDirectoryTree(DirectoryTreePtr const& tree, } } if (auto git_tree = GitRepo::CreateShallowTree(entries)) { - auto digest = - ArtifactDigestFactory::Create(HashFunction::Type::GitSHA1, - ToHexString(git_tree->first), - git_tree->second.size(), - /*is_tree=*/true); - if (digest) { - return std::make_shared<BlobTree>( - ArtifactBlob{*std::move(digest), - git_tree->second, - /*is_exec=*/false}, - nodes); + auto blob = ArtifactBlob::FromMemory( + HashFunction{HashFunction::Type::GitSHA1}, + ObjectType::Tree, + std::move(git_tree)->second); + if (blob.has_value()) { + return std::make_shared<BlobTree>(*std::move(blob), + std::move(nodes)); } } } catch (...) { diff --git a/src/buildtool/execution_api/git/git_api.cpp b/src/buildtool/execution_api/git/git_api.cpp index 6021a913..231e717a 100644 --- a/src/buildtool/execution_api/git/git_api.cpp +++ b/src/buildtool/execution_api/git/git_api.cpp @@ -223,19 +223,16 @@ auto GitApi::RetrieveToCas( return false; } - ArtifactDigest digest = - IsTreeObject(info->type) - ? ArtifactDigestFactory::HashDataAs<ObjectType::Tree>( - hash_function, *content) - : ArtifactDigestFactory::HashDataAs<ObjectType::File>( - hash_function, *content); + auto blob = ArtifactBlob::FromMemory( + hash_function, info->type, *std::move(content)); + if (not blob.has_value()) { + return false; + } // Collect blob and upload to remote CAS if transfer size reached. if (not UpdateContainerAndUpload( &container, - ArtifactBlob{std::move(digest), - std::move(*content), - IsExecutableObject(info->type)}, + *std::move(blob), /*exception_is_fatal=*/true, [&api](std::unordered_set<ArtifactBlob>&& blobs) { return api.Upload(std::move(blobs), diff --git a/src/buildtool/execution_api/local/local_api.cpp b/src/buildtool/execution_api/local/local_api.cpp index 040b4be6..92953190 100644 --- a/src/buildtool/execution_api/local/local_api.cpp +++ b/src/buildtool/execution_api/local/local_api.cpp @@ -25,7 +25,6 @@ #include <grpcpp/support/status.h> -#include "src/buildtool/common/artifact_digest_factory.hpp" #include "src/buildtool/common/protocol_traits.hpp" #include "src/buildtool/execution_api/bazel_msg/directory_tree.hpp" #include "src/buildtool/execution_api/common/common_api.hpp" @@ -177,26 +176,23 @@ auto LocalApi::RetrieveToCas( } // Read artifact content (file or symlink). - auto const& content = FileSystemManager::ReadFile(*path); + auto content = FileSystemManager::ReadFile(*path); if (not content) { return false; } - // Regenerate digest since object infos read by - // storage_.ReadTreeInfos() will contain 0 as size. - ArtifactDigest digest = - IsTreeObject(info->type) - ? ArtifactDigestFactory::HashDataAs<ObjectType::Tree>( - local_context_.storage_config->hash_function, *content) - : ArtifactDigestFactory::HashDataAs<ObjectType::File>( - local_context_.storage_config->hash_function, *content); + auto blob = ArtifactBlob::FromMemory( + local_context_.storage_config->hash_function, + info->type, + *std::move(content)); + if (not blob.has_value()) { + return false; + } // Collect blob and upload to remote CAS if transfer size reached. if (not UpdateContainerAndUpload( &container, - ArtifactBlob{std::move(digest), - *content, - IsExecutableObject(info->type)}, + *std::move(blob), /*exception_is_fatal=*/true, [&api](std::unordered_set<ArtifactBlob>&& blobs) { return api.Upload(std::move(blobs), diff --git a/src/buildtool/execution_api/remote/TARGETS b/src/buildtool/execution_api/remote/TARGETS index 0dd5ccb0..a575edb0 100644 --- a/src/buildtool/execution_api/remote/TARGETS +++ b/src/buildtool/execution_api/remote/TARGETS @@ -33,6 +33,7 @@ , ["src/buildtool/execution_api/common", "ids"] , ["src/buildtool/execution_api/common", "message_limits"] , ["src/buildtool/file_system", "git_repo"] + , ["src/buildtool/file_system", "object_type"] , ["src/buildtool/logging", "log_level"] , ["src/buildtool/logging", "logging"] , ["src/utils/cpp", "expected"] @@ -54,7 +55,6 @@ , ["src/buildtool/common", "protocol_traits"] , ["src/buildtool/common/remote", "retry"] , ["src/buildtool/execution_api/bazel_msg", "bazel_msg_factory"] - , ["src/buildtool/file_system", "object_type"] , ["src/utils/cpp", "back_map"] , ["src/utils/cpp", "gsl"] , ["src/utils/cpp", "path"] diff --git a/src/buildtool/execution_api/remote/bazel/bazel_cas_client.cpp b/src/buildtool/execution_api/remote/bazel/bazel_cas_client.cpp index dd4ec919..a02b8d4c 100644 --- a/src/buildtool/execution_api/remote/bazel/bazel_cas_client.cpp +++ b/src/buildtool/execution_api/remote/bazel/bazel_cas_client.cpp @@ -36,6 +36,7 @@ #include "src/buildtool/file_system/object_type.hpp" #include "src/buildtool/logging/log_level.hpp" #include "src/utils/cpp/back_map.hpp" +#include "src/utils/cpp/expected.hpp" namespace { @@ -302,12 +303,19 @@ auto BazelCasClient::BatchReadBlobs( std::vector<ArtifactBlob>* v, bazel_re::BatchReadBlobsResponse_Response const& r) { - if (auto value = - back_map->GetReference(r.digest())) { - v->emplace_back(*value.value(), - r.data(), - /*is_exec=*/false); + auto ref = back_map->GetReference(r.digest()); + if (not ref.has_value()) { + return; } + auto blob = ArtifactBlob::FromMemory( + HashFunction{ref.value()->GetHashType()}, + ref.value()->IsTree() ? ObjectType::Tree + : ObjectType::File, + r.data()); + if (not blob.has_value()) { + return; + } + v->emplace_back(*std::move(blob)); }); if (batch_response.ok) { std::move(batch_response.result.begin(), diff --git a/src/buildtool/execution_api/remote/bazel/bazel_response.cpp b/src/buildtool/execution_api/remote/bazel/bazel_response.cpp index f06a4275..d0429cd7 100644 --- a/src/buildtool/execution_api/remote/bazel/bazel_response.cpp +++ b/src/buildtool/execution_api/remote/bazel/bazel_response.cpp @@ -50,12 +50,8 @@ auto ProcessDirectoryMessage(HashFunction hash_function, fmt::format("found invalid symlink at {}", link.name())}; } } - auto data = dir.SerializeAsString(); - auto digest = ArtifactDigestFactory::HashDataAs<ObjectType::File>( - hash_function, data); - return ArtifactBlob{std::move(digest), - std::move(data), - /*is_exec=*/false}; + return ArtifactBlob::FromMemory( + hash_function, ObjectType::File, dir.SerializeAsString()); } } // namespace diff --git a/src/buildtool/execution_api/remote/bazel/bytestream_client.hpp b/src/buildtool/execution_api/remote/bazel/bytestream_client.hpp index 23a296c9..cf85b769 100644 --- a/src/buildtool/execution_api/remote/bazel/bytestream_client.hpp +++ b/src/buildtool/execution_api/remote/bazel/bytestream_client.hpp @@ -33,8 +33,10 @@ #include "src/buildtool/common/artifact_digest.hpp" #include "src/buildtool/common/remote/client_common.hpp" #include "src/buildtool/common/remote/port.hpp" +#include "src/buildtool/crypto/hash_function.hpp" #include "src/buildtool/execution_api/common/bytestream_utils.hpp" #include "src/buildtool/execution_api/common/ids.hpp" +#include "src/buildtool/file_system/object_type.hpp" #include "src/buildtool/logging/log_level.hpp" #include "src/buildtool/logging/logger.hpp" #include "src/utils/cpp/expected.hpp" @@ -115,7 +117,15 @@ class ByteStreamClient { if (not data) { return std::nullopt; } - return ArtifactBlob{digest, std::move(output), /*is_exec=*/false}; + + auto blob = ArtifactBlob::FromMemory( + HashFunction{digest.GetHashType()}, + digest.IsTree() ? ObjectType::Tree : ObjectType::File, + std::move(output)); + if (not blob.has_value() or blob->GetDigest() != digest) { + return std::nullopt; + } + return *std::move(blob); } [[nodiscard]] auto Write(std::string const& instance_name, diff --git a/src/buildtool/execution_engine/executor/executor.hpp b/src/buildtool/execution_engine/executor/executor.hpp index eea0336d..93cb9655 100644 --- a/src/buildtool/execution_engine/executor/executor.hpp +++ b/src/buildtool/execution_engine/executor/executor.hpp @@ -331,6 +331,7 @@ class ExecutorImpl { } // upload missing entries (blobs or trees) + HashFunction const hash_function{api.GetHashType()}; std::unordered_set<ArtifactBlob> container; for (auto const& [digest, value] : missing_entries) { auto const entry = value->second; @@ -338,13 +339,16 @@ class ExecutorImpl { if (not content.has_value()) { return false; } + auto blob = ArtifactBlob::FromMemory( + hash_function, entry->Type(), *std::move(content)); + if (not blob.has_value()) { + return false; + } // store and/or upload blob, taking into account the maximum // transfer size if (not UpdateContainerAndUpload( &container, - ArtifactBlob{*digest, - std::move(*content), - IsExecutableObject(entry->Type())}, + *std::move(blob), /*exception_is_fatal=*/true, [&api](std::unordered_set<ArtifactBlob>&& blobs) { return api.Upload(std::move(blobs), @@ -396,9 +400,14 @@ class ExecutorImpl { return false; } - return api.Upload({ArtifactBlob{info.digest, - std::move(*content), - IsExecutableObject(info.type)}}, + auto blob = ArtifactBlob::FromMemory( + HashFunction{api.GetHashType()}, info.type, *std::move(content)); + if (not blob.has_value()) { + Logger::Log(LogLevel::Error, "failed to create ArtifactBlob"); + return false; + } + + return api.Upload({*std::move(blob)}, /*skip_find_missing=*/true); } @@ -483,12 +492,14 @@ class ExecutorImpl { if (not content.has_value()) { return std::nullopt; } - HashFunction const hash_function{api.GetHashType()}; - auto digest = ArtifactDigestFactory::HashDataAs<ObjectType::File>( - hash_function, *content); - if (not api.Upload({ArtifactBlob{digest, - std::move(*content), - IsExecutableObject(*object_type)}})) { + + auto blob = ArtifactBlob::FromMemory( + HashFunction{api.GetHashType()}, *object_type, *std::move(content)); + if (not blob.has_value()) { + return std::nullopt; + } + auto digest = blob->GetDigest(); + if (not api.Upload({*std::move(blob)})) { return std::nullopt; } return Artifact::ObjectInfo{.digest = std::move(digest), diff --git a/src/buildtool/graph_traverser/TARGETS b/src/buildtool/graph_traverser/TARGETS index ab085350..e4aeeaa3 100644 --- a/src/buildtool/graph_traverser/TARGETS +++ b/src/buildtool/graph_traverser/TARGETS @@ -9,7 +9,6 @@ , ["src/buildtool/common", "action_description"] , ["src/buildtool/common", "artifact_blob"] , ["src/buildtool/common", "artifact_description"] - , ["src/buildtool/common", "artifact_digest_factory"] , ["src/buildtool/common", "cli"] , ["src/buildtool/common", "common"] , ["src/buildtool/common", "tree"] @@ -28,6 +27,7 @@ , ["src/buildtool/logging", "log_level"] , ["src/buildtool/logging", "logging"] , ["src/buildtool/progress_reporting", "base_progress_reporter"] + , ["src/utils/cpp", "expected"] , ["src/utils/cpp", "json"] , ["src/utils/cpp", "path"] ] diff --git a/src/buildtool/graph_traverser/graph_traverser.hpp b/src/buildtool/graph_traverser/graph_traverser.hpp index ac3067e8..5d240cd6 100644 --- a/src/buildtool/graph_traverser/graph_traverser.hpp +++ b/src/buildtool/graph_traverser/graph_traverser.hpp @@ -53,7 +53,6 @@ #include "src/buildtool/common/artifact_blob.hpp" #include "src/buildtool/common/artifact_description.hpp" #include "src/buildtool/common/artifact_digest.hpp" -#include "src/buildtool/common/artifact_digest_factory.hpp" #include "src/buildtool/common/cli.hpp" #include "src/buildtool/common/identifier.hpp" #include "src/buildtool/common/statistics.hpp" @@ -73,6 +72,7 @@ #include "src/buildtool/logging/log_level.hpp" #include "src/buildtool/logging/logger.hpp" #include "src/buildtool/progress_reporting/base_progress_reporter.hpp" +#include "src/utils/cpp/expected.hpp" #include "src/utils/cpp/json.hpp" #include "src/utils/cpp/path.hpp" @@ -313,21 +313,27 @@ class GraphTraverser { std::vector<std::string> const& blobs) const noexcept -> bool { std::unordered_set<ArtifactBlob> container; HashFunction const hash_function{context_.apis->remote->GetHashType()}; - for (auto const& blob : blobs) { - auto digest = ArtifactDigestFactory::HashDataAs<ObjectType::File>( - hash_function, blob); + for (auto const& content : blobs) { + auto blob = ArtifactBlob::FromMemory( + hash_function, ObjectType::File, content); + if (not blob.has_value()) { + logger_->Emit(LogLevel::Trace, + "Failed to create ArtifactBlob for:\n{}", + nlohmann::json(content).dump()); + return false; + } Logger::Log(logger_, LogLevel::Trace, [&]() { return fmt::format( "Will upload blob {}, its digest has id {} and size {}.", - nlohmann::json(blob).dump(), - digest.hash(), - digest.size()); + nlohmann::json(content).dump(), + blob->GetDigest().hash(), + blob->GetDigest().size()); }); // Store and/or upload blob, taking into account the maximum // transfer size. if (not UpdateContainerAndUpload( &container, - ArtifactBlob{std::move(digest), blob, /*is_exec=*/false}, + *std::move(blob), /*exception_is_fatal=*/true, [&api = context_.apis->remote]( std::unordered_set<ArtifactBlob>&& blobs) { |