summaryrefslogtreecommitdiff
path: root/src/buildtool/computed_roots/evaluate.cpp
diff options
context:
space:
mode:
authorKlaus Aehlig <klaus.aehlig@huawei.com>2025-01-23 11:48:49 +0100
committerKlaus Aehlig <klaus.aehlig@huawei.com>2025-01-23 16:53:07 +0100
commite181a0e0639a3904ca4e4f6bded05c429e6f66dd (patch)
treeafc70e22c709a257924af3b9e82ca259d134e10a /src/buildtool/computed_roots/evaluate.cpp
parent7c224674c8ab8277c607962dc547b3f27fee3c2b (diff)
downloadjustbuild-e181a0e0639a3904ca4e4f6bded05c429e6f66dd.tar.gz
Computed roots: add basic progress reporting
Diffstat (limited to 'src/buildtool/computed_roots/evaluate.cpp')
-rw-r--r--src/buildtool/computed_roots/evaluate.cpp57
1 files changed, 49 insertions, 8 deletions
diff --git a/src/buildtool/computed_roots/evaluate.cpp b/src/buildtool/computed_roots/evaluate.cpp
index 0f7ec1e9..6c280e20 100644
--- a/src/buildtool/computed_roots/evaluate.cpp
+++ b/src/buildtool/computed_roots/evaluate.cpp
@@ -15,6 +15,8 @@
#include "src/buildtool/computed_roots/evaluate.hpp"
#include <algorithm>
+#include <atomic>
+#include <condition_variable>
#include <cstddef>
#include <filesystem>
#include <functional>
@@ -25,6 +27,7 @@
#include <set>
#include <shared_mutex>
#include <sstream>
+#include <thread>
#include <utility>
#include <variant>
#include <vector>
@@ -44,6 +47,7 @@
#include "src/buildtool/computed_roots/analyse_and_build.hpp"
#include "src/buildtool/computed_roots/inquire_serve.hpp"
#include "src/buildtool/computed_roots/lookup_cache.hpp"
+#include "src/buildtool/computed_roots/roots_progress.hpp"
#include "src/buildtool/crypto/hash_function.hpp"
#include "src/buildtool/execution_api/common/api_bundle.hpp"
#include "src/buildtool/execution_api/common/execution_api.hpp"
@@ -64,6 +68,7 @@
#include "src/buildtool/multithreading/task_system.hpp"
#include "src/buildtool/progress_reporting/base_progress_reporter.hpp"
#include "src/buildtool/progress_reporting/progress.hpp"
+#include "src/buildtool/progress_reporting/task_tracker.hpp"
#include "src/buildtool/storage/storage.hpp"
#include "src/buildtool/tree_structure/tree_structure_utils.hpp"
#include "src/utils/cpp/expected.hpp"
@@ -157,6 +162,8 @@ void ComputeAndFill(
gsl::not_null<std::optional<RehashUtils::Rehasher>*> const& rehash,
gsl::not_null<std::shared_mutex*> const& config_lock,
gsl::not_null<std::mutex*> const& git_lock,
+ gsl::not_null<Statistics*> const& root_stats,
+ gsl::not_null<TaskTracker*> const& root_tasks,
std::size_t jobs,
RootMap::LoggerPtr const& logger,
RootMap::SetterPtr const& setter) {
@@ -181,6 +188,8 @@ void ComputeAndFill(
.statistics = &statistics,
.progress = &progress,
.serve = serve};
+ root_tasks->Start(target.ToString());
+ root_stats->IncrementActionsQueuedCounter();
Logger build_logger = Logger(
target.ToString(),
std::vector<LogSinkFactory>{LogSinkFile::CreateFactory(log_file)});
@@ -211,6 +220,10 @@ void ComputeAndFill(
return;
}
if (*cache_lookup) {
+
+ root_stats->IncrementActionsCachedCounter();
+ root_tasks->Stop(target.ToString());
+
std::string root = **cache_lookup;
auto tree_present =
GitRepo::IsTreeInRepo(storage_config->GitRoot(), root);
@@ -266,6 +279,10 @@ void ComputeAndFill(
repository_config->SetPrecomputedRoot(PrecomputedRoot{key},
root_result);
}
+
+ root_stats->IncrementExportsServedCounter();
+ root_tasks->Stop(target.ToString());
+
(*setter)(std::move(*serve_result));
return;
}
@@ -318,6 +335,10 @@ void ComputeAndFill(
(*logger)(std::move(result).error(), /*fatal=*/true);
return;
}
+
+ root_stats->IncrementActionsExecutedCounter();
+ root_tasks->Stop(target.ToString());
+
Logger::Log(LogLevel::Performance,
"Root {} evaluated to {}, log {}",
target.ToString(),
@@ -635,7 +656,9 @@ auto FillRoots(
gsl::not_null<const StorageConfig*> const& storage_config,
gsl::not_null<std::optional<RehashUtils::Rehasher>*> const& rehash,
gsl::not_null<std::shared_mutex*> const& config_lock,
- gsl::not_null<std::mutex*> const& git_lock) -> RootMap {
+ gsl::not_null<std::mutex*> const& git_lock,
+ gsl::not_null<Statistics*> const& stats,
+ gsl::not_null<TaskTracker*> const& tasks) -> RootMap {
RootMap::ValueCreator fill_roots = [storage_config,
rehash,
repository_config,
@@ -644,6 +667,8 @@ auto FillRoots(
context,
config_lock,
git_lock,
+ stats,
+ tasks,
jobs](auto /*ts*/,
auto setter,
auto logger,
@@ -668,6 +693,8 @@ auto FillRoots(
rehash,
git_lock,
jobs,
+ stats,
+ tasks,
logger = annotated_logger,
setter](auto /*values*/) {
if (auto const computed = key.AsComputed()) {
@@ -680,6 +707,8 @@ auto FillRoots(
rehash,
config_lock,
git_lock,
+ stats,
+ tasks,
jobs,
logger,
setter);
@@ -757,6 +786,8 @@ auto EvaluatePrecomputedRoots(
// bound.
std::shared_mutex repo_config_access{};
std::mutex git_access{};
+ Statistics stats{};
+ TaskTracker root_tasks{};
auto root_map = FillRoots(jobs,
repository_config,
&traverser_args,
@@ -765,21 +796,27 @@ auto EvaluatePrecomputedRoots(
&storage_config,
&rehash,
&repo_config_access,
- &git_access);
- bool failed = false;
- bool done = false;
+ &git_access,
+ &stats,
+ &root_tasks);
+ std::atomic<bool> done = false;
+ std::atomic<bool> failed = false;
+
+ std::atomic<bool> build_done = false;
+ std::condition_variable cv{};
+ auto reporter = RootsProgress::Reporter(&stats, &root_tasks);
+ auto observer = std::thread(
+ [&reporter, &build_done, &cv] { reporter(&build_done, &cv); });
{
TaskSystem ts{jobs};
root_map.ConsumeAfterKeysReady(
&ts,
roots,
[&roots, &done](auto values) {
- Logger::Log(LogLevel::Progress,
- "Computed roots evaluated, {} top level",
- roots.size());
Logger::Log(LogLevel::Debug, [&]() {
std::ostringstream msg{};
- msg << "Top-level computed roots";
+ msg << "Root building completed; top-level computed "
+ "roots";
for (int i = 0; i < roots.size(); i++) {
auto const& root = roots[i];
msg << "\n - " << root.ToString()
@@ -799,6 +836,10 @@ auto EvaluatePrecomputedRoots(
);
}
+ build_done = true;
+ cv.notify_all();
+ observer.join();
+
if (failed) {
return false;
}