diff options
author | Klaus Aehlig <klaus.aehlig@huawei.com> | 2022-04-04 10:42:30 +0200 |
---|---|---|
committer | Klaus Aehlig <klaus.aehlig@huawei.com> | 2022-04-04 19:31:22 +0200 |
commit | 6dea9b3430505b881f69ef3e569567ccdf66edce (patch) | |
tree | 66397ebc2f298fa69e733df2b33e6a25dc0e00d9 | |
parent | ef9b8b97a402e673929ea54dcf2bc8d2e0428037 (diff) | |
download | justbuild-6dea9b3430505b881f69ef3e569567ccdf66edce.tar.gz |
Add a basic progress reporter
Reporting, with exponentially backing off intervals, the number of
cache hits found so far, the number of actions that have ben run,
and the number of actions currently under consideration.
-rw-r--r-- | src/buildtool/main/TARGETS | 1 | ||||
-rw-r--r-- | src/buildtool/main/main.cpp | 4 | ||||
-rw-r--r-- | src/buildtool/progress_reporting/TARGETS | 12 | ||||
-rw-r--r-- | src/buildtool/progress_reporting/base_progress_reporter.cpp | 35 | ||||
-rw-r--r-- | src/buildtool/progress_reporting/base_progress_reporter.hpp | 21 |
5 files changed, 72 insertions, 1 deletions
diff --git a/src/buildtool/main/TARGETS b/src/buildtool/main/TARGETS index 6f9e2b46..6582137a 100644 --- a/src/buildtool/main/TARGETS +++ b/src/buildtool/main/TARGETS @@ -8,6 +8,7 @@ , ["src/buildtool/common", "config"] , ["src/buildtool/graph_traverser", "graph_traverser"] , ["src/buildtool/logging", "logging"] + , ["src/buildtool/progress_reporting", "base_progress_reporter"] , ["src/buildtool/build_engine/base_maps", "directory_map"] , ["src/buildtool/build_engine/base_maps", "rule_map"] , ["src/buildtool/build_engine/base_maps", "source_map"] diff --git a/src/buildtool/main/main.cpp b/src/buildtool/main/main.cpp index a28ff14f..4f626a4d 100644 --- a/src/buildtool/main/main.cpp +++ b/src/buildtool/main/main.cpp @@ -20,6 +20,7 @@ #include "src/buildtool/common/repository_config.hpp" #ifndef BOOTSTRAP_BUILD_TOOL #include "src/buildtool/graph_traverser/graph_traverser.hpp" +#include "src/buildtool/progress_reporting/base_progress_reporter.hpp" #endif #include "src/buildtool/logging/log_config.hpp" #include "src/buildtool/logging/log_sink_cmdline.hpp" @@ -1202,7 +1203,8 @@ auto main(int argc, char* argv[]) -> int { std::move(arguments.endpoint), std::move(arguments.build), std::move(stage_args), - std::move(rebuild_args)}}; + std::move(rebuild_args)}, + BaseProgressReporter::Reporter()}; if (arguments.cmd == SubCommand::kInstallCas) { return FetchAndInstallArtifacts(traverser.ExecutionApi(), diff --git a/src/buildtool/progress_reporting/TARGETS b/src/buildtool/progress_reporting/TARGETS new file mode 100644 index 00000000..99bb1f67 --- /dev/null +++ b/src/buildtool/progress_reporting/TARGETS @@ -0,0 +1,12 @@ +{ "base_progress_reporter": + { "type": ["@", "rules", "CC", "library"] + , "name": ["base_progress_reporter"] + , "hdrs": ["base_progress_reporter.hpp"] + , "srcs": ["base_progress_reporter.cpp"] + , "stage": ["src", "buildtool", "progress_reporting"] + , "deps": + [ ["src/buildtool/graph_traverser", "graph_traverser"] + , ["src/buildtool/common", "common"] + ] + } +} diff --git a/src/buildtool/progress_reporting/base_progress_reporter.cpp b/src/buildtool/progress_reporting/base_progress_reporter.cpp new file mode 100644 index 00000000..531e7804 --- /dev/null +++ b/src/buildtool/progress_reporting/base_progress_reporter.cpp @@ -0,0 +1,35 @@ +#ifndef BOOTSTRAP_BUILD_TOOL + +#include "src/buildtool/progress_reporting/base_progress_reporter.hpp" + +#include <mutex> + +#include "src/buildtool/common/statistics.hpp" +#include "src/buildtool/logging/logger.hpp" + +auto BaseProgressReporter::Reporter() -> GraphTraverser::progress_reporter_t { + return [](std::atomic<bool>* done, std::condition_variable* cv) { + std::mutex m; + auto const& stats = Statistics::Instance(); + std::unique_lock<std::mutex> lock(m); + int64_t delay = kStartDelayMillis; + while (not *done) { + cv->wait_for(lock, std::chrono::milliseconds(delay)); + if (not *done) { + // Note: order matters; queued has to be queried last + int cached = stats.ActionsCachedCounter(); + int run = stats.ActionsExecutedCounter(); + int queued = stats.ActionsQueuedCounter(); + Logger::Log(LogLevel::Progress, + "{} cached, {} run, {} processing", + cached, + run, + queued - run - cached); + } + delay = delay * kDelayScalingFactorNumerator / + kDelayScalingFactorDenominator; + } + }; +} + +#endif diff --git a/src/buildtool/progress_reporting/base_progress_reporter.hpp b/src/buildtool/progress_reporting/base_progress_reporter.hpp new file mode 100644 index 00000000..1e77ef39 --- /dev/null +++ b/src/buildtool/progress_reporting/base_progress_reporter.hpp @@ -0,0 +1,21 @@ +#ifndef INCLUDED_SRC_BUILDTOOL_PROGRESS_REPORTING_BASE_REPORTER_HPP +#define INCLUDED_SRC_BUILDTOOL_PROGRESS_REPORTING_BASE_REPORTER_HPP + +#ifndef BOOTSTRAP_BUILD_TOOL + +#include "src/buildtool/graph_traverser/graph_traverser.hpp" + +class BaseProgressReporter { + public: + static auto Reporter() -> GraphTraverser::progress_reporter_t; + + private: + constexpr static int64_t kStartDelayMillis = 3000; + // Scaling is roughly sqrt(2) + constexpr static int64_t kDelayScalingFactorNumerator = 99; + constexpr static int64_t kDelayScalingFactorDenominator = 70; +}; + +#endif + +#endif |