diff options
Diffstat (limited to 'src/buildtool/execution_api/remote/bazel')
4 files changed, 76 insertions, 29 deletions
diff --git a/src/buildtool/execution_api/remote/bazel/bazel_action.cpp b/src/buildtool/execution_api/remote/bazel/bazel_action.cpp index 6fa8eedc..604b680d 100644 --- a/src/buildtool/execution_api/remote/bazel/bazel_action.cpp +++ b/src/buildtool/execution_api/remote/bazel/bazel_action.cpp @@ -27,15 +27,15 @@ #include "src/buildtool/execution_api/utils/outputscheck.hpp" #include "src/buildtool/logging/log_level.hpp" -BazelAction::BazelAction( - std::shared_ptr<BazelNetwork> network, - ArtifactDigest root_digest, - std::vector<std::string> command, - std::string cwd, - std::vector<std::string> output_files, - std::vector<std::string> output_dirs, - std::map<std::string, std::string> const& env_vars, - std::map<std::string, std::string> const& properties) noexcept +BazelAction::BazelAction(std::shared_ptr<BazelNetwork> network, + ArtifactDigest root_digest, + std::vector<std::string> command, + std::string cwd, + std::vector<std::string> output_files, + std::vector<std::string> output_dirs, + std::map<std::string, std::string> const& env_vars, + std::map<std::string, std::string> const& properties, + bool best_effort) noexcept : network_{std::move(network)}, root_digest_{std::move(root_digest)}, cmdline_{std::move(command)}, @@ -45,9 +45,18 @@ BazelAction::BazelAction( env_vars_{BazelMsgFactory::CreateMessageVectorFromMap< bazel_re::Command_EnvironmentVariable>(env_vars)}, properties_{BazelMsgFactory::CreateMessageVectorFromMap< - bazel_re::Platform_Property>(properties)} { + bazel_re::Platform_Property>(properties)}, + mode_{best_effort ? RequestMode::kBestEffort : RequestMode::kV2_0} { std::sort(output_files_.begin(), output_files_.end()); std::sort(output_dirs_.begin(), output_dirs_.end()); + if (best_effort) { + output_paths_.reserve(output_files_.size() + output_dirs_.size()); + output_paths_.insert( + output_paths_.end(), output_files_.begin(), output_files_.end()); + output_paths_.insert( + output_paths_.end(), output_dirs_.begin(), output_dirs_.end()); + std::sort(output_paths_.begin(), output_paths_.end()); + } } auto BazelAction::Execute(Logger const* logger) noexcept @@ -90,13 +99,15 @@ auto BazelAction::Execute(Logger const* logger) noexcept }; if (do_cache) { - if (auto result = - network_->GetCachedActionResult(*action, output_files_)) { + if (auto result = network_->GetCachedActionResult( + *action, + mode_ == RequestMode::kV2_0 ? output_files_ : output_paths_)) { if (result->exit_code() == 0 and - ActionResultContainsExpectedOutputs( - *result, output_files_, output_dirs_) - - ) { + (mode_ == RequestMode::kV2_0 + ? ActionResultContainsExpectedOutputs( + *result, output_files_, output_dirs_) + : ActionResultContainsExpectedOutputs(*result, + output_paths_))) { return create_response( logger, action->hash(), @@ -154,6 +165,7 @@ auto BazelAction::CreateBundlesForAction( .cwd = &cwd_, .output_files = &output_files_, .output_dirs = &output_dirs_, + .output_paths = &output_paths_, .env_vars = &env_vars_, .properties = &properties_, .exec_dir = &exec_dir, diff --git a/src/buildtool/execution_api/remote/bazel/bazel_action.hpp b/src/buildtool/execution_api/remote/bazel/bazel_action.hpp index 08cb338c..ea3c4b53 100644 --- a/src/buildtool/execution_api/remote/bazel/bazel_action.hpp +++ b/src/buildtool/execution_api/remote/bazel/bazel_action.hpp @@ -16,6 +16,7 @@ #define INCLUDED_SRC_BUILDTOOL_EXECUTION_API_REMOTE_BAZEL_BAZEL_ACTION_HPP #include <chrono> +#include <cstdint> #include <map> #include <memory> #include <optional> @@ -36,6 +37,11 @@ class BazelAction final : public IExecutionAction { friend class BazelApi; + enum class RequestMode : std::uint8_t { + kV2_0, // RBEv2.0 + kBestEffort // RBEv2.0 and >=RBEv2.1, let the server pick + }; + public: auto Execute(Logger const* logger) noexcept -> IExecutionResponse::Ptr final; @@ -51,20 +57,22 @@ class BazelAction final : public IExecutionAction { std::string const cwd_; std::vector<std::string> output_files_; std::vector<std::string> output_dirs_; + std::vector<std::string> output_paths_; std::vector<bazel_re::Command_EnvironmentVariable> const env_vars_; std::vector<bazel_re::Platform_Property> const properties_; CacheFlag cache_flag_{CacheFlag::CacheOutput}; std::chrono::milliseconds timeout_{kDefaultTimeout}; + RequestMode mode_{}; - explicit BazelAction( - std::shared_ptr<BazelNetwork> network, - ArtifactDigest root_digest, - std::vector<std::string> command, - std::string cwd, - std::vector<std::string> output_files, - std::vector<std::string> output_dirs, - std::map<std::string, std::string> const& env_vars, - std::map<std::string, std::string> const& properties) noexcept; + explicit BazelAction(std::shared_ptr<BazelNetwork> network, + ArtifactDigest root_digest, + std::vector<std::string> command, + std::string cwd, + std::vector<std::string> output_files, + std::vector<std::string> output_dirs, + std::map<std::string, std::string> const& env_vars, + std::map<std::string, std::string> const& properties, + bool best_effort) noexcept; [[nodiscard]] auto CreateBundlesForAction( std::unordered_set<ArtifactBlob>* blobs, diff --git a/src/buildtool/execution_api/remote/bazel/bazel_api.cpp b/src/buildtool/execution_api/remote/bazel/bazel_api.cpp index c90b7024..00bb2e75 100644 --- a/src/buildtool/execution_api/remote/bazel/bazel_api.cpp +++ b/src/buildtool/execution_api/remote/bazel/bazel_api.cpp @@ -16,6 +16,7 @@ #include <algorithm> #include <atomic> +#include <compare> #include <cstdio> #include <exception> #include <functional> @@ -37,6 +38,7 @@ #include "src/buildtool/execution_api/common/stream_dumper.hpp" #include "src/buildtool/execution_api/common/tree_reader.hpp" #include "src/buildtool/execution_api/remote/bazel/bazel_action.hpp" +#include "src/buildtool/execution_api/remote/bazel/bazel_capabilities_client.hpp" #include "src/buildtool/execution_api/remote/bazel/bazel_network.hpp" #include "src/buildtool/execution_api/remote/bazel/bazel_network_reader.hpp" #include "src/buildtool/file_system/file_system_manager.hpp" @@ -49,6 +51,9 @@ namespace { +auto constexpr kVersion2dot1 = + Capabilities::Version{.major = 2, .minor = 1, .patch = 0}; + [[nodiscard]] auto RetrieveToCas( std::unordered_set<Artifact::ObjectInfo> const& infos, IExecutionApi const& api, @@ -146,6 +151,7 @@ BazelApi::BazelApi(BazelApi&& other) noexcept = default; // implement destructor in cpp, where all members are complete types BazelApi::~BazelApi() = default; +// NOLINTNEXTLINE(google-default-arguments) auto BazelApi::CreateAction( ArtifactDigest const& root_digest, std::vector<std::string> const& command, @@ -153,8 +159,26 @@ auto BazelApi::CreateAction( std::vector<std::string> const& output_files, std::vector<std::string> const& output_dirs, std::map<std::string, std::string> const& env_vars, - std::map<std::string, std::string> const& properties) const noexcept - -> IExecutionAction::Ptr { + std::map<std::string, std::string> const& properties, + bool force_legacy) const noexcept -> IExecutionAction::Ptr { + if (ProtocolTraits::IsNative(GetHashType())) { + // fall back to legacy for native + force_legacy = true; + } + + bool best_effort = not force_legacy; + if (not force_legacy and + network_->GetCapabilities()->high_api_version < kVersion2dot1) { + best_effort = false; + } + if (not best_effort and + network_->GetCapabilities()->low_api_version >= kVersion2dot1) { + Logger::Log(LogLevel::Warning, + "Server does not support RBEv2.0, falling back to newer " + "API version (best effort)."); + best_effort = true; + } + return std::unique_ptr<BazelAction>{new (std::nothrow) BazelAction{network_, root_digest, @@ -163,7 +187,8 @@ auto BazelApi::CreateAction( output_files, output_dirs, env_vars, - properties}}; + properties, + best_effort}}; } // NOLINTNEXTLINE(google-default-arguments) diff --git a/src/buildtool/execution_api/remote/bazel/bazel_api.hpp b/src/buildtool/execution_api/remote/bazel/bazel_api.hpp index df60204f..99e43578 100644 --- a/src/buildtool/execution_api/remote/bazel/bazel_api.hpp +++ b/src/buildtool/execution_api/remote/bazel/bazel_api.hpp @@ -58,6 +58,7 @@ class BazelApi final : public IExecutionApi { auto operator=(BazelApi&&) -> BazelApi& = delete; ~BazelApi() final; + // NOLINTNEXTLINE(google-default-arguments) [[nodiscard]] auto CreateAction( ArtifactDigest const& root_digest, std::vector<std::string> const& command, @@ -65,7 +66,8 @@ class BazelApi final : public IExecutionApi { std::vector<std::string> const& output_files, std::vector<std::string> const& output_dirs, std::map<std::string, std::string> const& env_vars, - std::map<std::string, std::string> const& properties) const noexcept + std::map<std::string, std::string> const& properties, + bool force_legacy = false) const noexcept -> IExecutionAction::Ptr final; // NOLINTNEXTLINE(google-default-arguments) |