diff options
author | Maksim Denisov <denisov.maksim@huawei.com> | 2024-09-02 17:55:35 +0200 |
---|---|---|
committer | Maksim Denisov <denisov.maksim@huawei.com> | 2024-09-09 13:07:13 +0200 |
commit | 56f91aac0c25e6e80dbaae087227502312accee6 (patch) | |
tree | 98996ba1159a492d2ec7e0a0d8116722215e36f1 /src | |
parent | e8d9f711ab3bc67c2ee64fae427b45b63dc47284 (diff) | |
download | justbuild-56f91aac0c25e6e80dbaae087227502312accee6.tar.gz |
Return ArtifactDigest from CreateActionDigestFromCommandLine
Diffstat (limited to 'src')
10 files changed, 65 insertions, 63 deletions
diff --git a/src/buildtool/execution_api/bazel_msg/TARGETS b/src/buildtool/execution_api/bazel_msg/TARGETS index c3a59b87..d2a3147a 100644 --- a/src/buildtool/execution_api/bazel_msg/TARGETS +++ b/src/buildtool/execution_api/bazel_msg/TARGETS @@ -33,11 +33,9 @@ , ["src/buildtool/crypto", "hash_function"] ] , "private-deps": - [ ["src/buildtool/compatibility", "compatibility"] - , ["src/utils/cpp", "hex_string"] + [ ["src/utils/cpp", "hex_string"] , ["src/buildtool/file_system", "file_system_manager"] , ["src/buildtool/file_system", "git_repo"] - , ["src/buildtool/common", "bazel_digest_factory"] , ["src/buildtool/common", "artifact_digest_factory"] ] , "stage": ["src", "buildtool", "execution_api", "bazel_msg"] 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 a0d9e8a8..a48e7541 100644 --- a/src/buildtool/execution_api/bazel_msg/bazel_msg_factory.cpp +++ b/src/buildtool/execution_api/bazel_msg/bazel_msg_factory.cpp @@ -26,9 +26,6 @@ #include <vector> #include "src/buildtool/common/artifact_digest_factory.hpp" -#include "src/buildtool/common/bazel_digest_factory.hpp" -#include "src/buildtool/common/bazel_types.hpp" -#include "src/buildtool/compatibility/native_support.hpp" #include "src/buildtool/file_system/file_system_manager.hpp" #include "src/buildtool/file_system/git_repo.hpp" #include "src/utils/cpp/hex_string.hpp" @@ -91,7 +88,7 @@ template <class T> bazel_re::FileNode node; node.set_name(file_name); node.set_is_executable(IsExecutableObject(type)); - (*node.mutable_digest()) = static_cast<bazel_re::Digest>(digest); + (*node.mutable_digest()) = ArtifactDigestFactory::ToBazel(digest); return node; } @@ -101,7 +98,7 @@ template <class T> -> bazel_re::DirectoryNode { bazel_re::DirectoryNode node; node.set_name(dir_name); - (*node.mutable_digest()) = static_cast<bazel_re::Digest>(digest); + (*node.mutable_digest()) = ArtifactDigestFactory::ToBazel(digest); return node; } @@ -162,7 +159,7 @@ struct DirectoryNodeBundle final { /// \brief Create bundle for protobuf message Command from args strings. [[nodiscard]] auto CreateCommandBundle( BazelMsgFactory::ActionDigestRequest const& request) - -> std::optional<BazelBlob> { + -> std::optional<ArtifactBlob> { bazel_re::Command msg; // DEPRECATED as of v2.2: platform properties are now specified // directly in the action. See documentation note in the @@ -187,18 +184,18 @@ struct DirectoryNodeBundle final { if (not content) { return std::nullopt; } - auto digest = BazelDigestFactory::HashDataAs<ObjectType::File>( + auto digest = ArtifactDigestFactory::HashDataAs<ObjectType::File>( request.hash_function, *content); - return BazelBlob{std::move(digest), - std::move(*content), - /*is_exec=*/false}; + return ArtifactBlob{std::move(digest), + std::move(*content), + /*is_exec=*/false}; } /// \brief Create bundle for protobuf message Action from Command. [[nodiscard]] auto CreateActionBundle( - bazel_re::Digest const& command, + ArtifactDigest const& command, BazelMsgFactory::ActionDigestRequest const& request) - -> std::optional<BazelBlob> { + -> std::optional<ArtifactBlob> { using seconds = std::chrono::seconds; using nanoseconds = std::chrono::nanoseconds; auto sec = std::chrono::duration_cast<seconds>(request.timeout); @@ -211,10 +208,10 @@ struct DirectoryNodeBundle final { bazel_re::Action msg; msg.set_do_not_cache(request.skip_action_cache); msg.set_allocated_timeout(duration.release()); - msg.set_allocated_command_digest( - gsl::owner<bazel_re::Digest*>{new bazel_re::Digest{command}}); - msg.set_allocated_input_root_digest( - gsl::owner<bazel_re::Digest*>{new bazel_re::Digest{*request.exec_dir}}); + *msg.mutable_command_digest() = ArtifactDigestFactory::ToBazel(command); + *msg.mutable_input_root_digest() = + ArtifactDigestFactory::ToBazel(*request.exec_dir); + // New in version 2.2: clients SHOULD set these platform properties // as well as those in the // [Command][build.bazel.remote.execution.v2.Command]. Servers @@ -226,11 +223,11 @@ struct DirectoryNodeBundle final { if (not content) { return std::nullopt; } - auto digest = BazelDigestFactory::HashDataAs<ObjectType::File>( + auto digest = ArtifactDigestFactory::HashDataAs<ObjectType::File>( request.hash_function, *content); - return BazelBlob{std::move(digest), - std::move(*content), - /*is_exec=*/false}; + return ArtifactBlob{std::move(digest), + std::move(*content), + /*is_exec=*/false}; } /// \brief Convert `DirectoryTree` to `DirectoryNodeBundle`. @@ -485,7 +482,7 @@ auto BazelMsgFactory::CreateGitTreeDigestFromLocalTree( } auto BazelMsgFactory::CreateActionDigestFromCommandLine( - ActionDigestRequest const& request) -> std::optional<bazel_re::Digest> { + ActionDigestRequest const& request) -> std::optional<ArtifactDigest> { auto cmd = CreateCommandBundle(request); if (not cmd) { return std::nullopt; @@ -496,12 +493,15 @@ auto BazelMsgFactory::CreateActionDigestFromCommandLine( return std::nullopt; } - if (not request.store_blob) { - return action->digest; + if (request.store_blob) { + std::invoke(*request.store_blob, + BazelBlob{ArtifactDigestFactory::ToBazel(cmd->digest), + cmd->data, + cmd->is_exec}); + std::invoke(*request.store_blob, + BazelBlob{ArtifactDigestFactory::ToBazel(action->digest), + action->data, + action->is_exec}); } - - auto digest = action->digest; - std::invoke(*request.store_blob, std::move(*cmd)); - std::invoke(*request.store_blob, std::move(*action)); - return digest; + return action->digest; } diff --git a/src/buildtool/execution_api/bazel_msg/bazel_msg_factory.hpp b/src/buildtool/execution_api/bazel_msg/bazel_msg_factory.hpp index 564c346b..51f1c5f0 100644 --- a/src/buildtool/execution_api/bazel_msg/bazel_msg_factory.hpp +++ b/src/buildtool/execution_api/bazel_msg/bazel_msg_factory.hpp @@ -29,7 +29,6 @@ #include "src/buildtool/common/bazel_types.hpp" #include "src/buildtool/crypto/hash_function.hpp" #include "src/buildtool/execution_api/bazel_msg/bazel_blob_container.hpp" -#include "src/buildtool/execution_api/bazel_msg/bazel_common.hpp" #include "src/buildtool/execution_api/bazel_msg/directory_tree.hpp" #include "src/buildtool/execution_api/common/artifact_blob_container.hpp" #include "src/buildtool/execution_engine/dag/dag.hpp" @@ -100,7 +99,7 @@ class BazelMsgFactory { /// CommandBundle that can be captured via BlobStoreFunc. /// \returns Digest representing the action. [[nodiscard]] static auto CreateActionDigestFromCommandLine( - ActionDigestRequest const& request) -> std::optional<bazel_re::Digest>; + ActionDigestRequest const& request) -> std::optional<ArtifactDigest>; /// \brief Create message vector from std::map. /// \param[in] input map @@ -161,7 +160,7 @@ struct BazelMsgFactory::ActionDigestRequest final { VectorPtr<bazel_re::Platform_Property> const properties; /// \brief The Digest of the execution directory. - gsl::not_null<bazel_re::Digest const*> const exec_dir; + gsl::not_null<ArtifactDigest const*> const exec_dir; /// \brief Hash function to be used. HashFunction const hash_function; diff --git a/src/buildtool/execution_api/local/TARGETS b/src/buildtool/execution_api/local/TARGETS index 61992aef..32d04697 100644 --- a/src/buildtool/execution_api/local/TARGETS +++ b/src/buildtool/execution_api/local/TARGETS @@ -27,6 +27,7 @@ , ["@", "grpc", "", "grpc++"] , "context" , ["src/buildtool/common", "common"] + , ["src/buildtool/common", "bazel_types"] , ["src/buildtool/common", "artifact_digest_factory"] , ["src/buildtool/common", "config"] , ["src/buildtool/storage", "storage"] @@ -49,7 +50,6 @@ , "private-deps": [ ["src/buildtool/file_system", "object_type"] , ["src/buildtool/system", "system_command"] - , ["src/buildtool/common", "bazel_types"] , ["src/buildtool/file_system", "file_system_manager"] , ["src/buildtool/execution_api/utils", "outputscheck"] , ["src/buildtool/crypto", "hash_function"] diff --git a/src/buildtool/execution_api/local/local_action.cpp b/src/buildtool/execution_api/local/local_action.cpp index 4a2dcfbc..2c79b32e 100644 --- a/src/buildtool/execution_api/local/local_action.cpp +++ b/src/buildtool/execution_api/local/local_action.cpp @@ -21,8 +21,6 @@ #include <system_error> #include <utility> -#include "src/buildtool/common/artifact_digest.hpp" -#include "src/buildtool/common/bazel_types.hpp" #include "src/buildtool/compatibility/native_support.hpp" #include "src/buildtool/execution_api/common/tree_reader.hpp" #include "src/buildtool/execution_api/local/local_cas_reader.hpp" @@ -85,7 +83,7 @@ auto LocalAction::Execute(Logger const* logger) noexcept -> IExecutionResponse::Ptr { auto do_cache = CacheEnabled(cache_flag_); - auto action = CreateActionDigest(root_digest_, not do_cache); + auto const action = CreateActionDigest(root_digest_, not do_cache); if (not action) { if (logger != nullptr) { logger->Emit(LogLevel::Error, @@ -101,13 +99,12 @@ auto LocalAction::Execute(Logger const* logger) noexcept " - exec_dir digest: {}\n" " - action digest: {}", root_digest_.hash(), - NativeSupport::Unprefix(action->hash())); + action->hash()); } if (do_cache) { - ArtifactDigest const a_digest{*action}; if (auto result = - local_context_.storage->ActionCache().CachedResult(a_digest)) { + local_context_.storage->ActionCache().CachedResult(*action)) { if (result->exit_code() == 0 and ActionResultContainsExpectedOutputs( *result, output_files_, output_dirs_)) { @@ -120,10 +117,11 @@ auto LocalAction::Execute(Logger const* logger) noexcept } if (ExecutionEnabled(cache_flag_)) { - if (auto output = Run(*action)) { + if (auto output = Run(static_cast<bazel_re::Digest>(*action))) { if (cache_flag_ == CacheFlag::PretendCached) { // ensure the same id is created as if caching were enabled - auto action_cached = CreateActionDigest(root_digest_, false); + auto const action_cached = + CreateActionDigest(root_digest_, false); if (not action_cached) { if (logger != nullptr) { logger->Emit( diff --git a/src/buildtool/execution_api/local/local_action.hpp b/src/buildtool/execution_api/local/local_action.hpp index 8cc12aba..dedc2951 100644 --- a/src/buildtool/execution_api/local/local_action.hpp +++ b/src/buildtool/execution_api/local/local_action.hpp @@ -25,6 +25,8 @@ #include <vector> #include "gsl/gsl" +#include "src/buildtool/common/artifact_digest.hpp" +#include "src/buildtool/common/bazel_types.hpp" #include "src/buildtool/execution_api/bazel_msg/bazel_msg_factory.hpp" #include "src/buildtool/execution_api/common/execution_action.hpp" #include "src/buildtool/execution_api/common/execution_response.hpp" @@ -97,11 +99,10 @@ class LocalAction final : public IExecutionAction { [[nodiscard]] auto CreateActionDigest(ArtifactDigest const& exec_dir, bool do_not_cache) - -> std::optional<bazel_re::Digest> { + -> std::optional<ArtifactDigest> { auto const env_vars = BazelMsgFactory::CreateMessageVectorFromMap< bazel_re::Command_EnvironmentVariable>(env_vars_); - auto const bazel_exec_dir = static_cast<bazel_re::Digest>(exec_dir); BazelMsgFactory::ActionDigestRequest request{ .command_line = &cmdline_, .cwd = &cwd_, @@ -109,7 +110,7 @@ class LocalAction final : public IExecutionAction { .output_dirs = &output_dirs_, .env_vars = &env_vars, .properties = &properties_, - .exec_dir = &bazel_exec_dir, + .exec_dir = &exec_dir, .hash_function = local_context_.storage_config->hash_function, .timeout = timeout_, .skip_action_cache = do_not_cache}; diff --git a/src/buildtool/execution_api/remote/TARGETS b/src/buildtool/execution_api/remote/TARGETS index e415ce1c..4bee7a7e 100644 --- a/src/buildtool/execution_api/remote/TARGETS +++ b/src/buildtool/execution_api/remote/TARGETS @@ -28,6 +28,7 @@ , ["src/buildtool/execution_api/common", "common"] , ["src/buildtool/execution_api/common", "artifact_blob_container"] , ["@", "gsl", "", "gsl"] + , ["src/buildtool/common", "common"] , ["src/buildtool/common", "bazel_types"] , ["src/buildtool/execution_api/bazel_msg", "bazel_msg"] , ["src/buildtool/execution_api/bazel_msg", "bazel_msg_factory"] @@ -46,8 +47,7 @@ ] , "stage": ["src", "buildtool", "execution_api", "remote"] , "private-deps": - [ ["src/buildtool/common", "common"] - , ["src/buildtool/common", "artifact_digest_factory"] + [ ["src/buildtool/common", "artifact_digest_factory"] , ["src/buildtool/common", "bazel_digest_factory"] , ["src/buildtool/file_system", "file_system_manager"] , ["src/buildtool/file_system", "object_type"] diff --git a/src/buildtool/execution_api/remote/bazel/bazel_action.cpp b/src/buildtool/execution_api/remote/bazel/bazel_action.cpp index dcbddb8d..15ca949f 100644 --- a/src/buildtool/execution_api/remote/bazel/bazel_action.cpp +++ b/src/buildtool/execution_api/remote/bazel/bazel_action.cpp @@ -16,6 +16,7 @@ #include <utility> // std::move +#include "src/buildtool/common/artifact_digest_factory.hpp" #include "src/buildtool/execution_api/bazel_msg/bazel_blob_container.hpp" #include "src/buildtool/execution_api/bazel_msg/bazel_msg_factory.hpp" #include "src/buildtool/execution_api/remote/bazel/bazel_response.hpp" @@ -24,7 +25,7 @@ BazelAction::BazelAction( std::shared_ptr<BazelNetwork> network, - bazel_re::Digest root_digest, + ArtifactDigest root_digest, std::vector<std::string> command, std::string cwd, std::vector<std::string> output_files, @@ -112,7 +113,7 @@ auto BazelAction::Execute(Logger const* logger) noexcept } auto BazelAction::CreateBundlesForAction(BazelBlobContainer* blobs, - bazel_re::Digest const& exec_dir, + ArtifactDigest const& exec_dir, bool do_not_cache) const noexcept -> std::optional<bazel_re::Digest> { using StoreFunc = BazelMsgFactory::ActionDigestRequest::BlobStoreFunc; @@ -134,5 +135,10 @@ auto BazelAction::CreateBundlesForAction(BazelBlobContainer* blobs, .timeout = timeout_, .skip_action_cache = do_not_cache, .store_blob = std::move(store_blob)}; - return BazelMsgFactory::CreateActionDigestFromCommandLine(request); + auto const action_digest = + BazelMsgFactory::CreateActionDigestFromCommandLine(request); + if (not action_digest) { + return std::nullopt; + } + return ArtifactDigestFactory::ToBazel(*action_digest); } diff --git a/src/buildtool/execution_api/remote/bazel/bazel_action.hpp b/src/buildtool/execution_api/remote/bazel/bazel_action.hpp index 7bf62a45..c990cc8e 100644 --- a/src/buildtool/execution_api/remote/bazel/bazel_action.hpp +++ b/src/buildtool/execution_api/remote/bazel/bazel_action.hpp @@ -21,6 +21,7 @@ #include <string> #include <vector> +#include "src/buildtool/common/artifact_digest.hpp" #include "src/buildtool/common/bazel_types.hpp" #include "src/buildtool/execution_api/common/execution_action.hpp" #include "src/buildtool/execution_api/remote/bazel/bazel_network.hpp" @@ -42,7 +43,7 @@ class BazelAction final : public IExecutionAction { private: std::shared_ptr<BazelNetwork> const network_; - bazel_re::Digest const root_digest_; + ArtifactDigest const root_digest_; std::vector<std::string> const cmdline_; std::string const cwd_; std::vector<std::string> output_files_; @@ -54,7 +55,7 @@ class BazelAction final : public IExecutionAction { explicit BazelAction( std::shared_ptr<BazelNetwork> network, - bazel_re::Digest root_digest, + ArtifactDigest root_digest, std::vector<std::string> command, std::string cwd, std::vector<std::string> output_files, @@ -63,7 +64,7 @@ class BazelAction final : public IExecutionAction { std::map<std::string, std::string> const& properties) noexcept; [[nodiscard]] auto CreateBundlesForAction(BazelBlobContainer* blobs, - bazel_re::Digest const& exec_dir, + ArtifactDigest const& exec_dir, bool do_not_cache) const noexcept -> std::optional<bazel_re::Digest>; }; diff --git a/src/buildtool/execution_api/remote/bazel/bazel_api.cpp b/src/buildtool/execution_api/remote/bazel/bazel_api.cpp index ee672503..cb4ca14b 100644 --- a/src/buildtool/execution_api/remote/bazel/bazel_api.cpp +++ b/src/buildtool/execution_api/remote/bazel/bazel_api.cpp @@ -213,15 +213,14 @@ auto BazelApi::CreateAction( std::map<std::string, std::string> const& env_vars, std::map<std::string, std::string> const& properties) const noexcept -> IExecutionAction::Ptr { - return std::unique_ptr<BazelAction>{ - new BazelAction{network_, - static_cast<bazel_re::Digest>(root_digest), - command, - cwd, - output_files, - output_dirs, - env_vars, - properties}}; + return std::unique_ptr<BazelAction>{new BazelAction{network_, + root_digest, + command, + cwd, + output_files, + output_dirs, + env_vars, + properties}}; } // NOLINTNEXTLINE(misc-no-recursion, google-default-arguments) |