diff options
author | Oliver Reiche <oliver.reiche@gmail.com> | 2023-04-15 16:28:33 +0200 |
---|---|---|
committer | Oliver Reiche <oliver.reiche@huawei.com> | 2023-04-26 18:29:44 +0200 |
commit | d762bfa1953933dfac0a29a74523c25719396b8c (patch) | |
tree | 1002b0aecc1af698f0349a4efb4bfc169886c60a /src/buildtool/execution_api/remote/bazel/bytestream_client.hpp | |
parent | 03e1019aca5d08e53bfeb455071d91561fc33039 (diff) | |
download | justbuild-d762bfa1953933dfac0a29a74523c25719396b8c.tar.gz |
imports: Switch to Microsoft GSL implementation
... with two minor code base changes compared to previous
use of gsl-lite:
- dag.hpp: ActionNode::Ptr and ArtifactNode::Ptr are not
wrapped in gsl::not_null<> anymore, due to lack of support
for wrapping std::unique_ptr<>. More specifically, the
move constructor is missing, rendering it impossible to
use std::vector<>::emplace_back().
- utils/cpp/gsl.hpp: New header file added to implement the
macros ExpectsAudit() and EnsureAudit(), asserts running
only in debug builds, which were available in gsl-lite but
are missing in MS GSL.
Diffstat (limited to 'src/buildtool/execution_api/remote/bazel/bytestream_client.hpp')
-rw-r--r-- | src/buildtool/execution_api/remote/bazel/bytestream_client.hpp | 93 |
1 files changed, 49 insertions, 44 deletions
diff --git a/src/buildtool/execution_api/remote/bazel/bytestream_client.hpp b/src/buildtool/execution_api/remote/bazel/bytestream_client.hpp index 79905b39..b9a55707 100644 --- a/src/buildtool/execution_api/remote/bazel/bytestream_client.hpp +++ b/src/buildtool/execution_api/remote/bazel/bytestream_client.hpp @@ -99,56 +99,61 @@ class ByteStreamClient { [[nodiscard]] auto Write(std::string const& resource_name, std::string const& data) const noexcept -> bool { - grpc::ClientContext ctx; - google::bytestream::WriteResponse response{}; - auto writer = stub_->Write(&ctx, &response); - - auto* allocated_data = - std::make_unique<std::string>(kChunkSize, '\0').release(); - google::bytestream::WriteRequest request{}; - request.set_resource_name(resource_name); - request.set_allocated_data(allocated_data); - std::size_t pos{}; - do { - auto const size = std::min(data.size() - pos, kChunkSize); - allocated_data->resize(size); - data.copy(allocated_data->data(), size, pos); - request.set_write_offset(static_cast<int>(pos)); - request.set_finish_write(pos + size >= data.size()); - if (not writer->Write(request)) { - // According to the docs, quote: - // If there is an error or the connection is broken during the - // `Write()`, the client should check the status of the - // `Write()` by calling `QueryWriteStatus()` and continue - // writing from the returned `committed_size`. - auto const committed_size = QueryWriteStatus(resource_name); - if (committed_size <= 0) { - logger_.Emit(LogLevel::Error, - "broken stream for upload to resource name {}", - resource_name); - return false; + try { + grpc::ClientContext ctx; + google::bytestream::WriteResponse response{}; + auto writer = stub_->Write(&ctx, &response); + + auto* allocated_data = + std::make_unique<std::string>(kChunkSize, '\0').release(); + google::bytestream::WriteRequest request{}; + request.set_resource_name(resource_name); + request.set_allocated_data(allocated_data); + std::size_t pos{}; + do { + auto const size = std::min(data.size() - pos, kChunkSize); + allocated_data->resize(size); + data.copy(allocated_data->data(), size, pos); + request.set_write_offset(static_cast<int>(pos)); + request.set_finish_write(pos + size >= data.size()); + if (not writer->Write(request)) { + // According to the docs, quote: + // If there is an error or the connection is broken during + // the `Write()`, the client should check the status of the + // `Write()` by calling `QueryWriteStatus()` and continue + // writing from the returned `committed_size`. + auto const committed_size = QueryWriteStatus(resource_name); + if (committed_size <= 0) { + logger_.Emit( + LogLevel::Error, + "broken stream for upload to resource name {}", + resource_name); + return false; + } + pos = gsl::narrow<std::size_t>(committed_size); + } + else { + pos += kChunkSize; } - pos = gsl::narrow<std::size_t>(committed_size); + } while (pos < data.size()); + if (not writer->WritesDone()) { + logger_.Emit(LogLevel::Error, + "broken stream for upload to resource name {}", + resource_name); + return false; } - else { - pos += kChunkSize; + + auto status = writer->Finish(); + if (not status.ok()) { + LogStatus(&logger_, LogLevel::Error, status); + return false; } - } while (pos < data.size()); - if (not writer->WritesDone()) { - logger_.Emit(LogLevel::Error, - "broken stream for upload to resource name {}", - resource_name); - return false; - } - auto status = writer->Finish(); - if (not status.ok()) { - LogStatus(&logger_, LogLevel::Error, status); + return gsl::narrow<std::size_t>(response.committed_size()) == + data.size(); + } catch (...) { return false; } - - return gsl::narrow<std::size_t>(response.committed_size()) == - data.size(); } template <class T_Input> |