diff options
author | Sascha Roloff <sascha.roloff@huawei.com> | 2022-09-13 15:02:45 +0200 |
---|---|---|
committer | Sascha Roloff <sascha.roloff@huawei.com> | 2022-10-11 16:42:39 +0200 |
commit | 06190c253f476c4bde74aa048cd53233091ac3cd (patch) | |
tree | eb196a63dafb64e3c64afd02d3ccae79c6af2d0f /src/buildtool/build_engine/target_map/target_cache.cpp | |
parent | dda280d9b651d20374caf61d54351960c93124b4 (diff) | |
download | justbuild-06190c253f476c4bde74aa048cd53233091ac3cd.tar.gz |
Scan provides map of target-cache entries for known artifacts
Diffstat (limited to 'src/buildtool/build_engine/target_map/target_cache.cpp')
-rw-r--r-- | src/buildtool/build_engine/target_map/target_cache.cpp | 102 |
1 files changed, 70 insertions, 32 deletions
diff --git a/src/buildtool/build_engine/target_map/target_cache.cpp b/src/buildtool/build_engine/target_map/target_cache.cpp index df741dd7..a16e591f 100644 --- a/src/buildtool/build_engine/target_map/target_cache.cpp +++ b/src/buildtool/build_engine/target_map/target_cache.cpp @@ -48,10 +48,73 @@ auto TargetCache::Entry::FromTarget( return std::nullopt; } -auto TargetCache::Entry::ToResult() const -> std::optional<TargetResult> { +auto TargetCache::Entry::ToResult() const noexcept + -> std::optional<TargetResult> { return TargetResult::FromJson(desc_); } +[[nodiscard]] auto ToObjectInfo(nlohmann::json const& json) + -> Artifact::ObjectInfo { + auto const& desc = ArtifactDescription::FromJson(json); + // The assumption is that all artifacts mentioned in a target cache + // entry are KNOWN to the remote side. + gsl_ExpectsAudit(desc and desc->IsKnown()); + auto const& info = desc->ToArtifact().Info(); + gsl_ExpectsAudit(info); + return *info; +} + +[[nodiscard]] auto ScanArtifactMap( + gsl::not_null<std::vector<Artifact::ObjectInfo>*> const& infos, + nlohmann::json const& json) -> bool { + if (not json.is_object()) { + return false; + } + infos->reserve(infos->size() + json.size()); + std::transform(json.begin(), + json.end(), + std::back_inserter(*infos), + [](auto const& item) { return ToObjectInfo(item); }); + return true; +} + +[[nodiscard]] auto ScanProvidesMap( + gsl::not_null<std::vector<Artifact::ObjectInfo>*> const& infos, + nlohmann::json const& json) -> bool { + if (not json.is_object()) { + return false; + } + auto const& nodes = json["nodes"]; + auto const& provided_artifacts = json["provided_artifacts"]; + infos->reserve(infos->size() + provided_artifacts.size()); + std::transform( + provided_artifacts.begin(), + provided_artifacts.end(), + std::back_inserter(*infos), + [&nodes](auto const& item) { + return ToObjectInfo(nodes[item.template get<std::string>()]); + }); + return true; +} + +auto TargetCache::Entry::ToArtifacts( + gsl::not_null<std::vector<Artifact::ObjectInfo>*> const& infos) + const noexcept -> bool { + try { + if (ScanArtifactMap(infos, desc_["artifacts"]) and + ScanArtifactMap(infos, desc_["runfiles"]) and + ScanProvidesMap(infos, desc_["provides"])) { + return true; + } + } catch (std::exception const& ex) { + Logger::Log( + LogLevel::Error, + "Scanning target cache entry for artifacts failed with:\n{}", + ex.what()); + } + return false; +} + auto TargetCache::Store(Key const& key, Entry const& value) const noexcept -> bool { // Before a target-cache entry is stored in local CAS, make sure any created @@ -105,45 +168,20 @@ auto TargetCache::Read(Key const& key) const noexcept return std::nullopt; } -auto TargetCache::DownloadKnownArtifactsFromMap( - Expression::map_t const& expr_map) const noexcept -> bool { - - // Get object infos of KNOWN artifacts from map. - std::vector<Artifact::ObjectInfo> infos; - infos.reserve(expr_map.size()); - for (auto const& item : expr_map) { - try { - auto const& desc = item.second->Artifact(); - // The assumption is that all artifacts mentioned in a target cache - // entry are KNOWN to the remote side. So they can be fetched to the - // local CAS. - gsl_ExpectsAudit(desc.IsKnown()); - infos.push_back(*desc.ToArtifact().Info()); - } catch (...) { - return false; - } +auto TargetCache::DownloadKnownArtifacts(Entry const& value) const noexcept + -> bool { + std::vector<Artifact::ObjectInfo> artifacts_info; + if (not value.ToArtifacts(&artifacts_info)) { + return false; } - #ifndef BOOTSTRAP_BUILD_TOOL // Sync KNOWN artifacts from remote to local CAS. - return remote_api_->RetrieveToCas(infos, local_api_); + return remote_api_->RetrieveToCas(artifacts_info, local_api_); #else return true; #endif } -auto TargetCache::DownloadKnownArtifacts(Entry const& value) const noexcept - -> bool { - auto const& result = value.ToResult(); - if (not DownloadKnownArtifactsFromMap(result->artifact_stage->Map())) { - return false; - } - if (not DownloadKnownArtifactsFromMap(result->runfiles->Map())) { - return false; - } - return true; -} - auto TargetCache::ComputeCacheDir() -> std::filesystem::path { return LocalExecutionConfig::TargetCacheDir() / ExecutionBackendId(); } |