summaryrefslogtreecommitdiff
path: root/src/buildtool/serve_api/serve_service/target.cpp
diff options
context:
space:
mode:
authorMaksim Denisov <denisov.maksim@huawei.com>2024-06-19 16:36:28 +0200
committerMaksim Denisov <denisov.maksim@huawei.com>2024-06-25 13:59:48 +0200
commit31731a01b497dd7c14acc8e1910dc0b0b28a9052 (patch)
treeeaff5266584ea6f59215de3e7cd24385896be094 /src/buildtool/serve_api/serve_service/target.cpp
parent5d63c2d05561d31b87b62cf3537b1bf1be6a1469 (diff)
downloadjustbuild-31731a01b497dd7c14acc8e1910dc0b0b28a9052.tar.gz
Pass ApiBundle to GraphTraverser
Diffstat (limited to 'src/buildtool/serve_api/serve_service/target.cpp')
-rw-r--r--src/buildtool/serve_api/serve_service/target.cpp133
1 files changed, 73 insertions, 60 deletions
diff --git a/src/buildtool/serve_api/serve_service/target.cpp b/src/buildtool/serve_api/serve_service/target.cpp
index 8e614a0e..bd88804f 100644
--- a/src/buildtool/serve_api/serve_service/target.cpp
+++ b/src/buildtool/serve_api/serve_service/target.cpp
@@ -50,15 +50,15 @@ auto TargetService::GetDispatchList(
// get blob from remote cas
auto const& dispatch_info = Artifact::ObjectInfo{.digest = dispatch_digest,
.type = ObjectType::File};
- if (!local_api_->IsAvailable(dispatch_digest) and
- !remote_api_->RetrieveToCas({dispatch_info}, &*local_api_)) {
+ if (not apis_.local->IsAvailable(dispatch_digest) and
+ not apis_.remote->RetrieveToCas({dispatch_info}, &*apis_.local)) {
return ::grpc::Status{::grpc::StatusCode::FAILED_PRECONDITION,
fmt::format("Could not retrieve blob {} from "
"remote-execution endpoint",
dispatch_info.ToString())};
}
// get blob content
- auto const& dispatch_str = local_api_->RetrieveToMemory(dispatch_info);
+ auto const& dispatch_str = apis_.local->RetrieveToMemory(dispatch_info);
if (not dispatch_str) {
// this should not fail unless something really broke...
return ::grpc::Status{
@@ -106,10 +106,10 @@ auto TargetService::HandleFailureLog(
return ::grpc::Status{::grpc::StatusCode::INTERNAL, msg};
}
// upload log blob to remote
- if (!local_api_->RetrieveToCas(
+ if (not apis_.local->RetrieveToCas(
{Artifact::ObjectInfo{.digest = ArtifactDigest{*digest},
.type = ObjectType::File}},
- &*remote_api_)) {
+ &*apis_.remote)) {
auto msg =
fmt::format("Failed to upload to remote CAS the failed {} log {}",
failure_scope,
@@ -143,7 +143,7 @@ auto TargetService::ServeTarget(
}
// start filling in the backend description
- auto address = RemoteExecutionConfig::RemoteAddress();
+ auto const address = RemoteExecutionConfig::RemoteAddress();
// read in the execution properties and add it to the description;
// Important: we will need to pass these platform properties also to the
// executor (via the graph_traverser) in order for the build to be properly
@@ -236,7 +236,7 @@ auto TargetService::ServeTarget(
return ::grpc::Status{::grpc::StatusCode::INTERNAL, msg};
}
artifacts.emplace_back(target_entry->second); // add the tc value
- if (!local_api_->RetrieveToCas(artifacts, &*remote_api_)) {
+ if (not apis_.local->RetrieveToCas(artifacts, &*apis_.remote)) {
auto msg = fmt::format(
"Failed to upload to remote cas the artifacts referenced in "
"the target cache entry {}",
@@ -253,8 +253,9 @@ auto TargetService::ServeTarget(
auto const& target_cache_key_info = Artifact::ObjectInfo{
.digest = target_cache_key_digest, .type = ObjectType::File};
- if (!local_api_->IsAvailable(target_cache_key_digest) and
- !remote_api_->RetrieveToCas({target_cache_key_info}, &*local_api_)) {
+ if (not apis_.local->IsAvailable(target_cache_key_digest) and
+ not apis_.remote->RetrieveToCas({target_cache_key_info},
+ &*apis_.local)) {
auto msg = fmt::format(
"Could not retrieve blob {} from remote-execution endpoint",
target_cache_key_info.ToString());
@@ -263,7 +264,7 @@ auto TargetService::ServeTarget(
}
auto const& target_description_str =
- local_api_->RetrieveToMemory(target_cache_key_info);
+ apis_.local->RetrieveToMemory(target_cache_key_info);
if (not target_description_str) {
// this should not fail unless something really broke...
auto msg = fmt::format(
@@ -330,11 +331,11 @@ auto TargetService::ServeTarget(
return ::grpc::Status{::grpc::StatusCode::NOT_FOUND, msg};
}
ArtifactDigest repo_key_dgst{repo_key->String(), 0, /*is_tree=*/false};
- if (!local_api_->IsAvailable(repo_key_dgst) and
- !remote_api_->RetrieveToCas(
+ if (not apis_.local->IsAvailable(repo_key_dgst) and
+ not apis_.remote->RetrieveToCas(
{Artifact::ObjectInfo{.digest = repo_key_dgst,
.type = ObjectType::File}},
- &*local_api_)) {
+ &*apis_.local)) {
auto msg = fmt::format(
"Could not retrieve blob {} from remote-execution endpoint",
repo_key->String());
@@ -494,50 +495,62 @@ auto TargetService::ServeTarget(
jobs = serve_config_.jobs;
}
- // setup graph traverser
- GraphTraverser::CommandLineArguments traverser_args{};
- traverser_args.jobs = jobs;
- traverser_args.build.timeout = serve_config_.action_timeout;
- traverser_args.stage = std::nullopt;
- traverser_args.rebuild = std::nullopt;
- GraphTraverser const traverser{
- std::move(traverser_args),
- &repository_config,
- std::move(platform_properties),
- std::move(dispatch_list),
- &stats,
- &progress,
- ProgressReporter::Reporter(&stats, &progress, &logger),
- &logger};
-
- // perform build
- auto build_result = traverser.BuildAndStage(
- artifacts, runfiles, actions, blobs, trees, std::move(cache_artifacts));
-
- if (not build_result) {
- // report failure locally, to keep track of it...
- logger_->Emit(LogLevel::Warning,
- "Build for target {} failed",
- configured_target.target.ToString());
- return HandleFailureLog(tmp_log, "build", response);
- }
-
- WriteTargetCacheEntries(cache_targets,
- build_result->extra_infos,
- jobs,
- traverser.GetLocalApi(),
- traverser.GetRemoteApi(),
- serve_config_.tc_strategy,
- tc,
- &logger,
- LogLevel::Error);
-
- if (build_result->failed_artifacts) {
- // report failure locally, to keep track of it...
- logger_->Emit(LogLevel::Warning,
- "Build result for target {} contains failed artifacts ",
- configured_target.target.ToString());
- return HandleFailureLog(tmp_log, "artifacts", response);
+ {
+ // setup graph traverser
+ GraphTraverser::CommandLineArguments traverser_args{};
+ traverser_args.jobs = jobs;
+ traverser_args.build.timeout = serve_config_.action_timeout;
+ traverser_args.stage = std::nullopt;
+ traverser_args.rebuild = std::nullopt;
+
+ // Use a new ApiBundle that knows about local repository config for
+ // traversing.
+ ApiBundle const local_apis{&repository_config, address};
+ GraphTraverser const traverser{
+ std::move(traverser_args),
+ &repository_config,
+ std::move(platform_properties),
+ std::move(dispatch_list),
+ &stats,
+ &progress,
+ &local_apis,
+ ProgressReporter::Reporter(&stats, &progress, &logger),
+ &logger};
+
+ // perform build
+ auto build_result = traverser.BuildAndStage(artifacts,
+ runfiles,
+ actions,
+ blobs,
+ trees,
+ std::move(cache_artifacts));
+
+ if (not build_result) {
+ // report failure locally, to keep track of it...
+ logger_->Emit(LogLevel::Warning,
+ "Build for target {} failed",
+ configured_target.target.ToString());
+ return HandleFailureLog(tmp_log, "build", response);
+ }
+
+ WriteTargetCacheEntries(cache_targets,
+ build_result->extra_infos,
+ jobs,
+ &*local_apis.local,
+ &*local_apis.remote,
+ serve_config_.tc_strategy,
+ tc,
+ &logger,
+ LogLevel::Error);
+
+ if (build_result->failed_artifacts) {
+ // report failure locally, to keep track of it...
+ logger_->Emit(
+ LogLevel::Warning,
+ "Build result for target {} contains failed artifacts ",
+ configured_target.target.ToString());
+ return HandleFailureLog(tmp_log, "artifacts", response);
+ }
}
// now that the target cache key is in, make sure remote CAS has all
@@ -554,7 +567,7 @@ auto TargetService::ServeTarget(
return ::grpc::Status{::grpc::StatusCode::INTERNAL, msg};
}
tc_artifacts.emplace_back(target_entry->second); // add the tc value
- if (!local_api_->RetrieveToCas(tc_artifacts, &*remote_api_)) {
+ if (not apis_.local->RetrieveToCas(tc_artifacts, &*apis_.remote)) {
auto msg = fmt::format(
"Failed to upload to remote cas the artifacts referenced in "
"the target cache entry {}",
@@ -895,10 +908,10 @@ auto TargetService::ServeTargetDescription(
Storage::Instance().CAS().StoreBlob(description_str,
/*is_executable=*/false)) {
auto const& artifact_dgst = ArtifactDigest{*dgst};
- if (not local_api_->RetrieveToCas(
+ if (not apis_.local->RetrieveToCas(
{Artifact::ObjectInfo{.digest = artifact_dgst,
.type = ObjectType::File}},
- &*remote_api_)) {
+ &*apis_.remote)) {
auto error_msg = fmt::format(
"Failed to upload to remote cas the description blob {}",
artifact_dgst.hash());