From b98addc8f8e3e62e1213cd967f20aa631057f84e Mon Sep 17 00:00:00 2001 From: Paul Cristian Sarbu Date: Thu, 24 Oct 2024 11:21:23 +0200 Subject: serve service: Respond with digest for blob and tree checks ...to be able to interrogate remotes irrespective of protocol. When serve endpoint is active, it will provide the correct digest with which to interrogate the remote endpoint. Otherwise, for a compatible remote check the file mappings for the correct digest. The serve service proto file is updated accordingly. --- .../serve_api/remote/source_tree_client.cpp | 36 +++++++++++++++++----- 1 file changed, 28 insertions(+), 8 deletions(-) (limited to 'src/buildtool/serve_api/remote/source_tree_client.cpp') diff --git a/src/buildtool/serve_api/remote/source_tree_client.cpp b/src/buildtool/serve_api/remote/source_tree_client.cpp index f3538ca3..5f0bce80 100644 --- a/src/buildtool/serve_api/remote/source_tree_client.cpp +++ b/src/buildtool/serve_api/remote/source_tree_client.cpp @@ -239,7 +239,7 @@ auto SourceTreeClient::ServeForeignFileTree(const std::string& content, } auto SourceTreeClient::ServeContent(std::string const& content) const noexcept - -> bool { + -> expected { justbuild::just_serve::ServeContentRequest request{}; request.set_content(content); @@ -249,20 +249,30 @@ auto SourceTreeClient::ServeContent(std::string const& content) const noexcept if (not status.ok()) { LogStatus(&logger_, LogLevel::Debug, status); - return false; + return unexpected{GitLookupError::Fatal}; } if (response.status() != ::justbuild::just_serve::ServeContentResponse::OK) { logger_.Emit(LogLevel::Debug, "ServeContent response returned with {}", static_cast(response.status())); - return false; + return unexpected{ + response.status() != + ::justbuild::just_serve::ServeContentResponse::NOT_FOUND + ? GitLookupError::Fatal + : GitLookupError::NotFound}; } - return true; + auto digest = ArtifactDigestFactory::FromBazel(hash_function_.GetType(), + response.digest()); + if (not digest) { + logger_.Emit(LogLevel::Debug, std::move(digest).error()); + return unexpected{GitLookupError::Fatal}; + } + return *std::move(digest); // success } auto SourceTreeClient::ServeTree(std::string const& tree_id) const noexcept - -> bool { + -> expected { justbuild::just_serve::ServeTreeRequest request{}; request.set_tree(tree_id); @@ -272,15 +282,25 @@ auto SourceTreeClient::ServeTree(std::string const& tree_id) const noexcept if (not status.ok()) { LogStatus(&logger_, LogLevel::Debug, status); - return false; + return unexpected{GitLookupError::Fatal}; } if (response.status() != ::justbuild::just_serve::ServeTreeResponse::OK) { logger_.Emit(LogLevel::Debug, "ServeTree response returned with {}", static_cast(response.status())); - return false; + return unexpected{ + response.status() != + ::justbuild::just_serve::ServeTreeResponse::NOT_FOUND + ? GitLookupError::Fatal + : GitLookupError::NotFound}; } - return true; + auto digest = ArtifactDigestFactory::FromBazel(hash_function_.GetType(), + response.digest()); + if (not digest) { + logger_.Emit(LogLevel::Debug, std::move(digest).error()); + return unexpected{GitLookupError::Fatal}; + } + return *std::move(digest); // success } auto SourceTreeClient::CheckRootTree(std::string const& tree_id) const noexcept -- cgit v1.2.3