From bbcc5977f49646941ac35060bb74a27eda5fbd76 Mon Sep 17 00:00:00 2001 From: Oliver Reiche Date: Mon, 23 Jun 2025 14:56:04 +0200 Subject: ExecutionAPI: Support output_paths in requests ... and prepare local execution for clients using only RBEv2.1 (setting only output_paths). --- src/buildtool/execution_api/local/local_action.hpp | 63 +++++++++++++++++++--- 1 file changed, 56 insertions(+), 7 deletions(-) (limited to 'src/buildtool/execution_api/local/local_action.hpp') diff --git a/src/buildtool/execution_api/local/local_action.hpp b/src/buildtool/execution_api/local/local_action.hpp index 7610def0..47f912d8 100644 --- a/src/buildtool/execution_api/local/local_action.hpp +++ b/src/buildtool/execution_api/local/local_action.hpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include // IWYU pragma: keep #include @@ -45,6 +46,12 @@ class LocalAction final : public IExecutionAction { friend class LocalApi; + enum class RequestMode : std::uint8_t { + kV2_0, // RBEv2.0 + kV2_1, // >=RBEv2.1 + kBestEffort // construct both, let the server pick + }; + public: struct Output { bazel_re::ActionResult action; @@ -56,6 +63,9 @@ class LocalAction final : public IExecutionAction { std::variant; using OutputDirOrSymlink = std::variant; + using OutputPath = std::variant; using FileCopies = std::unordered_map; @@ -76,31 +86,65 @@ class LocalAction final : public IExecutionAction { std::string const cwd_; std::vector output_files_; std::vector output_dirs_; + std::vector output_paths_; std::map const env_vars_; std::vector const properties_; std::chrono::milliseconds timeout_{kDefaultTimeout}; CacheFlag cache_flag_{CacheFlag::CacheOutput}; + RequestMode mode_{}; + + explicit LocalAction(gsl::not_null local_context, + ArtifactDigest root_digest, + std::vector command, + std::string cwd, + std::vector output_files, + std::vector output_dirs, + std::map env_vars, + std::map const& properties, + bool best_effort) noexcept + : local_context_{*local_context}, + root_digest_{std::move(root_digest)}, + cmdline_{std::move(command)}, + cwd_{std::move(cwd)}, + output_files_{std::move(output_files)}, + output_dirs_{std::move(output_dirs)}, + env_vars_{std::move(env_vars)}, + properties_{BazelMsgFactory::CreateMessageVectorFromMap< + 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()); + } + } + // Alternative constructor with combined output_paths for files and dirs, as + // it is used by RBEv2.1 and above. explicit LocalAction( gsl::not_null local_context, ArtifactDigest root_digest, std::vector command, std::string cwd, - std::vector output_files, - std::vector output_dirs, + std::vector output_paths, std::map env_vars, std::map const& properties) noexcept : local_context_{*local_context}, root_digest_{std::move(root_digest)}, cmdline_{std::move(command)}, cwd_{std::move(cwd)}, - output_files_{std::move(output_files)}, - output_dirs_{std::move(output_dirs)}, + output_paths_{std::move(output_paths)}, env_vars_{std::move(env_vars)}, properties_{BazelMsgFactory::CreateMessageVectorFromMap< - bazel_re::Platform_Property>(properties)} { - std::sort(output_files_.begin(), output_files_.end()); - std::sort(output_dirs_.begin(), output_dirs_.end()); + bazel_re::Platform_Property>(properties)}, + mode_{RequestMode::kV2_1} { + std::sort(output_paths_.begin(), output_paths_.end()); } [[nodiscard]] auto CreateActionDigest(ArtifactDigest const& exec_dir, @@ -114,6 +158,7 @@ class LocalAction final : public IExecutionAction { .cwd = &cwd_, .output_files = &output_files_, .output_dirs = &output_dirs_, + .output_paths = &output_paths_, .env_vars = &env_vars, .properties = &properties_, .exec_dir = &exec_dir, @@ -153,6 +198,10 @@ class LocalAction final : public IExecutionAction { std::string const& local_path) const noexcept -> std::optional; + [[nodiscard]] auto CollectOutputPath(std::filesystem::path const& exec_path, + std::string const& local_path) + const noexcept -> std::optional; + [[nodiscard]] auto CollectAndStoreOutputs( bazel_re::ActionResult* result, std::filesystem::path const& exec_path) const noexcept -> bool; -- cgit v1.2.3