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.cpp86
1 files changed, 53 insertions, 33 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 412c4ecf..6c7f985e 100644
--- a/src/buildtool/execution_api/remote/bazel/bazel_cas_client.cpp
+++ b/src/buildtool/execution_api/remote/bazel/bazel_cas_client.cpp
@@ -321,44 +321,64 @@ auto BazelCasClient::SplitBlob(std::string const& instance_name,
return ProcessResponseContents<bazel_re::Digest>(response);
}
-template <class T_OutputIter>
+template <class T_ForwardIter>
auto BazelCasClient::FindMissingBlobs(std::string const& instance_name,
- T_OutputIter const& start,
- T_OutputIter const& end) noexcept
+ T_ForwardIter const& start,
+ T_ForwardIter const& end) noexcept
-> std::vector<bazel_re::Digest> {
- auto request =
- CreateRequest<bazel_re::FindMissingBlobsRequest, bazel_re::Digest>(
- instance_name, start, end);
-
- bazel_re::FindMissingBlobsResponse response;
- auto [ok, status] = WithRetry(
- [this, &response, &request]() {
- grpc::ClientContext context;
- return stub_->FindMissingBlobs(&context, request, &response);
- },
- logger_);
- std::vector<bazel_re::Digest> result{};
- if (ok) {
- result = ProcessResponseContents<bazel_re::Digest>(response);
+ std::vector<bazel_re::Digest> result;
+ if (start == end) {
+ return result;
}
- else {
- LogStatus(&logger_, LogLevel::Error, status);
- }
-
- logger_.Emit(LogLevel::Trace, [&start, &end, &result]() {
- std::ostringstream oss{};
- oss << "find missing blobs" << std::endl;
- std::for_each(start, end, [&oss](auto const& digest) {
- oss << fmt::format(" - {}", digest.hash()) << std::endl;
- });
- oss << "missing blobs" << std::endl;
- std::for_each(
- result.cbegin(), result.cend(), [&oss](auto const& digest) {
+ try {
+ result.reserve(std::distance(start, end));
+ auto requests =
+ CreateBatchRequestsMaxSize<bazel_re::FindMissingBlobsRequest>(
+ instance_name,
+ start,
+ end,
+ "FindMissingBlobs",
+ [](bazel_re::FindMissingBlobsRequest* request,
+ bazel_re::Digest const& x) {
+ *(request->add_blob_digests()) = x;
+ });
+ for (auto const& request : requests) {
+ bazel_re::FindMissingBlobsResponse response;
+ auto [ok, status] = WithRetry(
+ [this, &response, &request]() {
+ grpc::ClientContext context;
+ return stub_->FindMissingBlobs(
+ &context, request, &response);
+ },
+ logger_);
+ if (ok) {
+ auto batch =
+ ProcessResponseContents<bazel_re::Digest>(response);
+ for (auto&& x : batch) {
+ result.emplace_back(std::move(x));
+ }
+ }
+ else {
+ LogStatus(
+ &logger_, LogLevel::Error, status, "FindMissingBlobs");
+ }
+ }
+ logger_.Emit(LogLevel::Trace, [&start, &end, &result]() {
+ std::ostringstream oss{};
+ oss << "find missing blobs" << std::endl;
+ std::for_each(start, end, [&oss](auto const& digest) {
oss << fmt::format(" - {}", digest.hash()) << std::endl;
});
- return oss.str();
- });
-
+ oss << "missing blobs" << std::endl;
+ std::for_each(
+ result.cbegin(), result.cend(), [&oss](auto const& digest) {
+ oss << fmt::format(" - {}", digest.hash()) << std::endl;
+ });
+ return oss.str();
+ });
+ } catch (...) {
+ logger_.Emit(LogLevel::Error, "Caught exception in FindMissingBlobs");
+ }
return result;
}