diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/buildtool/serve_api/remote/TARGETS | 1 | ||||
-rw-r--r-- | src/buildtool/serve_api/remote/target_client.cpp | 59 | ||||
-rw-r--r-- | src/buildtool/serve_api/serve_service/TARGETS | 2 | ||||
-rw-r--r-- | src/buildtool/serve_api/serve_service/target.cpp | 62 |
4 files changed, 82 insertions, 42 deletions
diff --git a/src/buildtool/serve_api/remote/TARGETS b/src/buildtool/serve_api/remote/TARGETS index fe8bfcda..c211d26f 100644 --- a/src/buildtool/serve_api/remote/TARGETS +++ b/src/buildtool/serve_api/remote/TARGETS @@ -73,6 +73,7 @@ , "private-deps": [ ["src/buildtool/common/remote", "client_common"] , ["src/buildtool/common", "bazel_types"] + , ["src/buildtool/common", "artifact_digest_factory"] , ["@", "fmt", "", "fmt"] , ["@", "json", "", "json"] ] diff --git a/src/buildtool/serve_api/remote/target_client.cpp b/src/buildtool/serve_api/remote/target_client.cpp index 85a6eefc..1404fe6e 100644 --- a/src/buildtool/serve_api/remote/target_client.cpp +++ b/src/buildtool/serve_api/remote/target_client.cpp @@ -21,10 +21,28 @@ #include "fmt/core.h" #include "nlohmann/json.hpp" +#include "src/buildtool/common/artifact_digest_factory.hpp" #include "src/buildtool/common/bazel_types.hpp" #include "src/buildtool/common/remote/client_common.hpp" #include "src/buildtool/logging/log_level.hpp" +namespace { +[[nodiscard]] auto GetTargetValue( + HashFunction::Type hash_type, + justbuild::just_serve::ServeTargetResponse const& response) noexcept + -> std::optional<ArtifactDigest> { + if (not response.has_target_value()) { + return std::nullopt; + } + auto result = + ArtifactDigestFactory::FromBazel(hash_type, response.target_value()); + if (not result) { + return std::nullopt; + } + return *std::move(result); +} +} // namespace + TargetClient::TargetClient( ServerAddress const& address, gsl::not_null<Storage const*> const& storage, @@ -58,9 +76,9 @@ auto TargetClient::ServeTarget(const TargetCacheKey& key, } // add target cache key to request - bazel_re::Digest key_dgst{key.Id().digest}; justbuild::just_serve::ServeTargetRequest request{}; - request.mutable_target_cache_key_id()->CopyFrom(key_dgst); + *request.mutable_target_cache_key_id() = + ArtifactDigestFactory::ToBazel(key.Id().digest); // add execution properties to request for (auto const& [k, v] : exec_config_.platform_properties) { @@ -102,7 +120,7 @@ auto TargetClient::ServeTarget(const TargetCacheKey& key, dispatch_info.ToString())}; } (*request.mutable_dispatch_info()) = - static_cast<bazel_re::Digest>(*dispatch_dgst); + ArtifactDigestFactory::ToBazel(*dispatch_dgst); // call rpc grpc::ClientContext context; @@ -114,21 +132,29 @@ auto TargetClient::ServeTarget(const TargetCacheKey& key, case grpc::StatusCode::OK: { // if log has been set, pass it along as index 0 if (response.has_log()) { - return serve_target_result_t{ - std::in_place_index<0>, - ArtifactDigest(response.log()).hash()}; + auto log_digest = ArtifactDigestFactory::FromBazel( + storage_.GetHashFunction().GetType(), response.log()); + if (not log_digest) { + return serve_target_result_t{ + std::in_place_index<1>, + fmt::format("Failed to convert log digest: {}", + std::move(log_digest).error())}; + } + return serve_target_result_t{std::in_place_index<0>, + log_digest->hash()}; } // if no log has been set, it must have the target cache value - if (not response.has_target_value()) { + auto const target_value_dgst = + GetTargetValue(storage_.GetHashFunction().GetType(), response); + if (not target_value_dgst) { return serve_target_result_t{ std::in_place_index<1>, "Serve endpoint failed to set expected response field"}; } - auto const& target_value_dgst = - ArtifactDigest{response.target_value()}; - auto const& obj_info = Artifact::ObjectInfo{ - .digest = target_value_dgst, .type = ObjectType::File}; - if (not apis_.local->IsAvailable(target_value_dgst)) { + + auto const obj_info = Artifact::ObjectInfo{ + .digest = *target_value_dgst, .type = ObjectType::File}; + if (not apis_.local->IsAvailable(*target_value_dgst)) { if (not apis_.remote->RetrieveToCas({obj_info}, *apis_.local)) { return serve_target_result_t{ std::in_place_index<1>, @@ -223,7 +249,14 @@ auto TargetClient::ServeTargetDescription( LogStatus(&logger_, LogLevel::Error, status); return std::nullopt; } - return ArtifactDigest{response.description_id()}; + + auto result = ArtifactDigestFactory::FromBazel( + storage_.GetHashFunction().GetType(), response.description_id()); + if (not result) { + logger_.Emit(LogLevel::Error, "{}", std::move(result).error()); + return std::nullopt; + } + return *std::move(result); } #endif // BOOTSTRAP_BUILD_TOOL diff --git a/src/buildtool/serve_api/serve_service/TARGETS b/src/buildtool/serve_api/serve_service/TARGETS index 1a080b66..7bcb583e 100644 --- a/src/buildtool/serve_api/serve_service/TARGETS +++ b/src/buildtool/serve_api/serve_service/TARGETS @@ -117,8 +117,8 @@ , ["src/buildtool/multithreading", "task_system"] , ["src/buildtool/progress_reporting", "progress_reporter"] , ["src/buildtool/common", "common"] + , ["src/buildtool/common", "artifact_digest_factory"] , ["src/buildtool/file_system", "object_type"] - , ["src/utils/cpp", "verify_hash"] , ["src/buildtool/progress_reporting", "progress"] , ["src/buildtool/main", "analyse_context"] , ["src/buildtool/common", "config"] diff --git a/src/buildtool/serve_api/serve_service/target.cpp b/src/buildtool/serve_api/serve_service/target.cpp index d2e66ae0..5bd94ba2 100644 --- a/src/buildtool/serve_api/serve_service/target.cpp +++ b/src/buildtool/serve_api/serve_service/target.cpp @@ -25,6 +25,8 @@ #include "src/buildtool/build_engine/target_map/configured_target.hpp" #include "src/buildtool/build_engine/target_map/result_map.hpp" #include "src/buildtool/common/artifact.hpp" +#include "src/buildtool/common/artifact_digest.hpp" +#include "src/buildtool/common/artifact_digest_factory.hpp" #include "src/buildtool/common/remote/retry_config.hpp" #include "src/buildtool/common/repository_config.hpp" #include "src/buildtool/common/statistics.hpp" @@ -45,7 +47,6 @@ #include "src/buildtool/storage/garbage_collector.hpp" #include "src/buildtool/storage/repository_garbage_collector.hpp" #include "src/buildtool/storage/target_cache_key.hpp" -#include "src/utils/cpp/verify_hash.hpp" auto TargetService::GetDispatchList( ArtifactDigest const& dispatch_digest) noexcept @@ -114,7 +115,7 @@ auto TargetService::HandleFailureLog( return ::grpc::Status{::grpc::StatusCode::UNAVAILABLE, msg}; } // set response with log digest - (*response->mutable_log()) = static_cast<bazel_re::Digest>(*digest); + (*response->mutable_log()) = ArtifactDigestFactory::ToBazel(*digest); return ::grpc::Status::OK; } @@ -127,13 +128,16 @@ auto TargetService::CreateRemoteExecutionConfig( platform_properties[p.name()] = p.value(); } // read in the dispatch list - if (auto msg = IsAHash(request->dispatch_info().hash()); msg) { - logger_->Emit(LogLevel::Error, "{}", *msg); - return unexpected{ - ::grpc::Status{::grpc::StatusCode::INVALID_ARGUMENT, *msg}}; + auto const dispatch_info_digest = ArtifactDigestFactory::FromBazel( + local_context_.storage_config->hash_function.GetType(), + request->dispatch_info()); + if (not dispatch_info_digest) { + logger_->Emit(LogLevel::Error, "{}", dispatch_info_digest.error()); + return unexpected{::grpc::Status{::grpc::StatusCode::INVALID_ARGUMENT, + dispatch_info_digest.error()}}; } - auto const& dispatch_info_digest = ArtifactDigest{request->dispatch_info()}; - auto res = GetDispatchList(dispatch_info_digest); + + auto res = GetDispatchList(*dispatch_info_digest); if (not res) { auto err = move(res).error(); logger_->Emit(LogLevel::Error, "{}", err.error_message()); @@ -152,12 +156,14 @@ auto TargetService::ServeTarget( const ::justbuild::just_serve::ServeTargetRequest* request, ::justbuild::just_serve::ServeTargetResponse* response) -> ::grpc::Status { // check target cache key hash for validity - if (auto msg = IsAHash(request->target_cache_key_id().hash()); msg) { - logger_->Emit(LogLevel::Error, "{}", *msg); - return ::grpc::Status{::grpc::StatusCode::INVALID_ARGUMENT, *msg}; + auto const target_cache_key_digest = ArtifactDigestFactory::FromBazel( + local_context_.storage_config->hash_function.GetType(), + request->target_cache_key_id()); + if (not target_cache_key_digest) { + logger_->Emit(LogLevel::Error, "{}", target_cache_key_digest.error()); + return ::grpc::Status{::grpc::StatusCode::INVALID_ARGUMENT, + target_cache_key_digest.error()}; } - auto const& target_cache_key_digest = - ArtifactDigest{request->target_cache_key_id()}; // acquire locks auto repo_lock = @@ -207,7 +213,7 @@ auto TargetService::ServeTarget( : std::nullopt; auto const& tc = local_context_.storage->TargetCache().WithShard(shard); auto const& tc_key = - TargetCacheKey{{target_cache_key_digest, ObjectType::File}}; + TargetCacheKey{{*target_cache_key_digest, ObjectType::File}}; // check if target-level cache entry has already been computed if (auto target_entry = tc.Read(tc_key); target_entry) { @@ -233,15 +239,15 @@ auto TargetService::ServeTarget( } // populate response with the target cache value (*response->mutable_target_value()) = - static_cast<bazel_re::Digest>(target_entry->second.digest); + ArtifactDigestFactory::ToBazel(target_entry->second.digest); return ::grpc::Status::OK; } // get target description from remote cas auto const& target_cache_key_info = Artifact::ObjectInfo{ - .digest = target_cache_key_digest, .type = ObjectType::File}; + .digest = *target_cache_key_digest, .type = ObjectType::File}; - if (not apis_.local->IsAvailable(target_cache_key_digest) and + if (not apis_.local->IsAvailable(*target_cache_key_digest) and not apis_.remote->RetrieveToCas({target_cache_key_info}, *apis_.local)) { auto msg = fmt::format( @@ -268,7 +274,7 @@ auto TargetService::ServeTarget( nlohmann::json::parse(*target_description_str)); } catch (std::exception const& ex) { auto msg = fmt::format("Parsing TargetCacheKey {} failed with:\n{}", - target_cache_key_digest.hash(), + target_cache_key_digest->hash(), ex.what()); logger_->Emit(LogLevel::Error, "{}", msg); return ::grpc::Status{::grpc::StatusCode::INTERNAL, msg}; @@ -277,7 +283,7 @@ auto TargetService::ServeTarget( not target_description_dict->IsMap()) { auto msg = fmt::format("TargetCacheKey {} should contain a map, but found {}", - target_cache_key_digest.hash(), + target_cache_key_digest->hash(), target_description_dict.ToJson().dump()); logger_->Emit(LogLevel::Error, "{}", msg); return ::grpc::Status{::grpc::StatusCode::NOT_FOUND, msg}; @@ -293,7 +299,7 @@ auto TargetService::ServeTarget( if (not target_description_dict->At(key)) { error_msg = fmt::format("TargetCacheKey {} does not contain key \"{}\"", - target_cache_key_digest.hash(), + target_cache_key_digest->hash(), key); logger_->Emit(LogLevel::Error, "{}", error_msg); return false; @@ -313,7 +319,7 @@ auto TargetService::ServeTarget( auto msg = fmt::format( "TargetCacheKey {}: \"repo_key\" value should be a string, but " "found {}", - target_cache_key_digest.hash(), + target_cache_key_digest->hash(), repo_key.ToJson().dump()); logger_->Emit(LogLevel::Error, "{}", msg); return ::grpc::Status{::grpc::StatusCode::NOT_FOUND, msg}; @@ -361,7 +367,7 @@ auto TargetService::ServeTarget( auto msg = fmt::format( "TargetCacheKey {}: \"target_name\" value should be a string, but" " found {}", - target_cache_key_digest.hash(), + target_cache_key_digest->hash(), target_expr.ToJson().dump()); logger_->Emit(LogLevel::Error, "{}", msg); return ::grpc::Status{::grpc::StatusCode::FAILED_PRECONDITION, msg}; @@ -372,7 +378,7 @@ auto TargetService::ServeTarget( } catch (std::exception const& ex) { auto msg = fmt::format( "TargetCacheKey {}: parsing \"target_name\" failed with:\n{}", - target_cache_key_digest.hash(), + target_cache_key_digest->hash(), ex.what()); logger_->Emit(LogLevel::Error, "{}", msg); return ::grpc::Status{::grpc::StatusCode::FAILED_PRECONDITION, msg}; @@ -385,7 +391,7 @@ auto TargetService::ServeTarget( auto msg = fmt::format( "TargetCacheKey {}: \"effective_config\" value should be a string," " but found {}", - target_cache_key_digest.hash(), + target_cache_key_digest->hash(), config_expr.ToJson().dump()); logger_->Emit(LogLevel::Error, "{}", msg); return ::grpc::Status{::grpc::StatusCode::FAILED_PRECONDITION, msg}; @@ -397,7 +403,7 @@ auto TargetService::ServeTarget( } catch (std::exception const& ex) { auto msg = fmt::format( "TargetCacheKey {}: parsing \"effective_config\" failed with:\n{}", - target_cache_key_digest.hash(), + target_cache_key_digest->hash(), ex.what()); logger_->Emit(LogLevel::Error, "{}", msg); return ::grpc::Status{::grpc::StatusCode::FAILED_PRECONDITION, msg}; @@ -574,13 +580,13 @@ auto TargetService::ServeTarget( } // populate response with the target cache value (*response->mutable_target_value()) = - static_cast<bazel_re::Digest>(target_entry->second.digest); + ArtifactDigestFactory::ToBazel(target_entry->second.digest); return ::grpc::Status::OK; } // target cache value missing -- internally something is very wrong auto msg = fmt::format("Failed to read TargetCacheKey {} after store", - target_cache_key_digest.hash()); + target_cache_key_digest->hash()); logger_->Emit(LogLevel::Error, "{}", msg); return ::grpc::Status{::grpc::StatusCode::INTERNAL, msg}; } @@ -931,7 +937,7 @@ auto TargetService::ServeTargetDescription( // populate response (*response->mutable_description_id()) = - static_cast<bazel_re::Digest>(*dgst); + ArtifactDigestFactory::ToBazel(*dgst); return ::grpc::Status::OK; } // failed to store blob |