summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlberto Sartori <alberto.sartori@huawei.com>2023-12-20 12:41:43 +0100
committerAlberto Sartori <alberto.sartori@huawei.com>2023-12-21 10:11:11 +0100
commit35a2e4f044b24a0cdec184b9e8faf44c5ee1a537 (patch)
tree5c9007b07fcd3f4149fb10c7c10c968318c457f8 /src
parent67da9cc6f6ada922ae81a47a55bce25914a00136 (diff)
downloadjustbuild-35a2e4f044b24a0cdec184b9e8faf44c5ee1a537.tar.gz
BazelCasClient: define new templated CreateBatchRequestsMaxSize member function.
This function will ensure that each request does not exceeds the maximum message size, currently set by kMaxBatchTransferSize in the message_limits library.
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,