summaryrefslogtreecommitdiff
path: root/src/buildtool/execution_api/remote/bazel
diff options
context:
space:
mode:
Diffstat (limited to 'src/buildtool/execution_api/remote/bazel')
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_action.cpp44
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_action.hpp26
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_api.cpp31
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_api.hpp4
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)