diff options
Diffstat (limited to 'src/buildtool/execution_api/common')
-rw-r--r-- | src/buildtool/execution_api/common/bytestream_utils.cpp | 53 | ||||
-rw-r--r-- | src/buildtool/execution_api/common/bytestream_utils.hpp | 37 |
2 files changed, 90 insertions, 0 deletions
diff --git a/src/buildtool/execution_api/common/bytestream_utils.cpp b/src/buildtool/execution_api/common/bytestream_utils.cpp index cd1f0d19..f1b53f05 100644 --- a/src/buildtool/execution_api/common/bytestream_utils.cpp +++ b/src/buildtool/execution_api/common/bytestream_utils.cpp @@ -102,3 +102,56 @@ auto ByteStreamUtils::ReadRequest::GetDigest() const noexcept -> bazel_re::Digest { return ToBazelDigest(hash_, size_); } + +ByteStreamUtils::WriteRequest::WriteRequest( + std::string instance_name, + std::string uuid, + bazel_re::Digest const& digest) noexcept + : instance_name_{std::move(instance_name)}, + uuid_{std::move(uuid)}, + hash_{digest.hash()}, + size_{digest.size_bytes()} {} + +auto ByteStreamUtils::WriteRequest::ToString() && noexcept -> std::string { + return fmt::format("{}/{}/{}/{}/{}/{}", + std::move(instance_name_), + ByteStreamUtils::kUploads, + std::move(uuid_), + ByteStreamUtils::kBlobs, + std::move(hash_), + size_); +} + +auto ByteStreamUtils::WriteRequest::FromString( + std::string const& request) noexcept -> std::optional<WriteRequest> { + static constexpr std::size_t kInstanceNameIndex = 0U; + static constexpr std::size_t kUploadsIndex = 1U; + static constexpr std::size_t kUUIDIndex = 2U; + static constexpr std::size_t kBlobsIndex = 3U; + static constexpr std::size_t kHashIndex = 4U; + static constexpr std::size_t kSizeIndex = 5U; + static constexpr std::size_t kWriteRequestPartsCount = 6U; + + auto const parts = ::SplitRequest(request); + if (parts.size() != kWriteRequestPartsCount or + parts.at(kUploadsIndex).compare(ByteStreamUtils::kUploads) != 0 or + parts.at(kBlobsIndex).compare(ByteStreamUtils::kBlobs) != 0) { + return std::nullopt; + } + + WriteRequest result; + result.instance_name_ = std::string(parts.at(kInstanceNameIndex)); + result.uuid_ = std::string(parts.at(kUUIDIndex)); + result.hash_ = std::string(parts.at(kHashIndex)); + try { + result.size_ = std::stoi(std::string(parts.at(kSizeIndex))); + } catch (...) { + return std::nullopt; + } + return result; +} + +auto ByteStreamUtils::WriteRequest::GetDigest() const noexcept + -> bazel_re::Digest { + return ToBazelDigest(hash_, size_); +} diff --git a/src/buildtool/execution_api/common/bytestream_utils.hpp b/src/buildtool/execution_api/common/bytestream_utils.hpp index 9b46073f..672ae017 100644 --- a/src/buildtool/execution_api/common/bytestream_utils.hpp +++ b/src/buildtool/execution_api/common/bytestream_utils.hpp @@ -27,6 +27,7 @@ namespace bazel_re = build::bazel::remote::execution::v2; class ByteStreamUtils final { static constexpr auto* kBlobs = "blobs"; + static constexpr auto* kUploads = "uploads"; public: // Chunk size for uploads (default size used by BuildBarn) @@ -61,6 +62,42 @@ class ByteStreamUtils final { ReadRequest() = default; }; + + /// \brief Create a write request for the bytestream service to be + /// transferred over the net. Handles serialization/deserialization on its + /// own. The pattern is: + /// "{instance_name}/{kUploads}/{uuid}/{kBlobs}/{digest.hash()}/{digest.size_bytes()}". + /// "instance_name_example/uploads/c4f03510-7d56-4490-8934-01bce1b1288e/blobs/62183d7a696acf7e69e218efc82c93135f8c85f895/4424712" + class WriteRequest final { + public: + explicit WriteRequest(std::string instance_name, + std::string uuid, + bazel_re::Digest const& digest) noexcept; + + [[nodiscard]] auto ToString() && noexcept -> std::string; + + [[nodiscard]] static auto FromString( + std::string const& request) noexcept -> std::optional<WriteRequest>; + + [[nodiscard]] auto GetInstanceName() const noexcept + -> std::string const& { + return instance_name_; + } + + [[nodiscard]] auto GetUUID() const noexcept -> std::string const& { + return uuid_; + } + + [[nodiscard]] auto GetDigest() const noexcept -> bazel_re::Digest; + + private: + std::string instance_name_; + std::string uuid_; + std::string hash_; + std::int64_t size_ = 0; + + WriteRequest() = default; + }; }; #endif // INCLUDED_SRC_BUILDTOOL_EXECUTION_API_COMMON_BYTESTREAM_UTILS_HPP |