summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_cas_client.cpp48
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_cas_client.hpp10
2 files changed, 58 insertions, 0 deletions
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 e4f46403..e390ae91 100644
--- a/src/buildtool/execution_api/remote/bazel/bazel_cas_client.cpp
+++ b/src/buildtool/execution_api/remote/bazel/bazel_cas_client.cpp
@@ -27,6 +27,7 @@
#include "src/buildtool/compatibility/native_support.hpp"
#include "src/buildtool/crypto/hash_function.hpp"
#include "src/buildtool/execution_api/common/execution_common.hpp"
+#include "src/buildtool/execution_api/common/message_limits.hpp"
namespace {
@@ -493,6 +494,53 @@ auto GetResponseContents<bazel_re::Digest, bazel_re::SplitBlobResponse>(
} // namespace detail
+template <typename T_Request, typename T_ForwardIter>
+auto BazelCasClient::CreateBatchRequestsMaxSize(
+ std::string const& instance_name,
+ T_ForwardIter const& first,
+ T_ForwardIter const& last,
+ std::string const& heading,
+ std::function<void(T_Request*,
+ typename T_ForwardIter::value_type const&)> const&
+ request_builder) const noexcept -> std::vector<T_Request> {
+ if (first == last) {
+ return {};
+ }
+ std::vector<T_Request> result;
+ T_Request accumulating_request;
+ std::for_each(
+ first,
+ last,
+ [&instance_name, &accumulating_request, &result, &request_builder](
+ auto const& blob) {
+ T_Request request;
+ request.set_instance_name(instance_name);
+ request_builder(&request, blob);
+ if (accumulating_request.ByteSizeLong() + request.ByteSizeLong() >
+ kMaxBatchTransferSize) {
+ result.emplace_back(std::move(accumulating_request));
+ accumulating_request = std::move(request);
+ }
+ else {
+ accumulating_request.MergeFrom(request);
+ }
+ });
+ result.emplace_back(std::move(accumulating_request));
+ logger_.Emit(LogLevel::Trace, [&heading, &result]() {
+ std::ostringstream oss{};
+ std::size_t count{0};
+ oss << heading << " - Request sizes:" << std::endl;
+ std::for_each(
+ result.begin(), result.end(), [&oss, &count](auto const& request) {
+ oss << fmt::format(
+ " {}: {} bytes", ++count, request.ByteSizeLong())
+ << std::endl;
+ });
+ return oss.str();
+ });
+ return result;
+}
+
template <class T_Request, class T_Content, class T_OutputIter>
auto BazelCasClient::CreateRequest(std::string const& instance_name,
T_OutputIter const& start,
diff --git a/src/buildtool/execution_api/remote/bazel/bazel_cas_client.hpp b/src/buildtool/execution_api/remote/bazel/bazel_cas_client.hpp
index 5f3060df..2cc2ed9c 100644
--- a/src/buildtool/execution_api/remote/bazel/bazel_cas_client.hpp
+++ b/src/buildtool/execution_api/remote/bazel/bazel_cas_client.hpp
@@ -154,6 +154,16 @@ class BazelCasClient {
T_OutputIter const& end) noexcept
-> std::vector<bazel_re::Digest>;
+ template <typename T_Request, typename T_ForwardIter>
+ [[nodiscard]] auto CreateBatchRequestsMaxSize(
+ std::string const& instance_name,
+ T_ForwardIter const& first,
+ T_ForwardIter const& last,
+ std::string const& heading,
+ std::function<void(T_Request*,
+ typename T_ForwardIter::value_type const&)> const&
+ request_builder) const noexcept -> std::vector<T_Request>;
+
template <class T_Request, class T_Content, class T_OutputIter>
[[nodiscard]] auto CreateRequest(std::string const& instance_name,
T_OutputIter const& start,