summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/buildtool/serve_api/remote/TARGETS1
-rw-r--r--src/buildtool/serve_api/remote/target_client.cpp59
-rw-r--r--src/buildtool/serve_api/serve_service/TARGETS2
-rw-r--r--src/buildtool/serve_api/serve_service/target.cpp62
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