From 6dea9b3430505b881f69ef3e569567ccdf66edce Mon Sep 17 00:00:00 2001 From: Klaus Aehlig Date: Mon, 4 Apr 2022 10:42:30 +0200 Subject: 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. --- src/buildtool/main/TARGETS | 1 + src/buildtool/main/main.cpp | 4 ++- src/buildtool/progress_reporting/TARGETS | 12 ++++++++ .../progress_reporting/base_progress_reporter.cpp | 35 ++++++++++++++++++++++ .../progress_reporting/base_progress_reporter.hpp | 21 +++++++++++++ 5 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 src/buildtool/progress_reporting/TARGETS create mode 100644 src/buildtool/progress_reporting/base_progress_reporter.cpp create mode 100644 src/buildtool/progress_reporting/base_progress_reporter.hpp (limited to 'src') 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 + +#include "src/buildtool/common/statistics.hpp" +#include "src/buildtool/logging/logger.hpp" + +auto BaseProgressReporter::Reporter() -> GraphTraverser::progress_reporter_t { + return [](std::atomic* done, std::condition_variable* cv) { + std::mutex m; + auto const& stats = Statistics::Instance(); + std::unique_lock 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 -- cgit v1.2.3