summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKlaus Aehlig <klaus.aehlig@huawei.com>2022-04-04 10:42:30 +0200
committerKlaus Aehlig <klaus.aehlig@huawei.com>2022-04-04 19:31:22 +0200
commit6dea9b3430505b881f69ef3e569567ccdf66edce (patch)
tree66397ebc2f298fa69e733df2b33e6a25dc0e00d9
parentef9b8b97a402e673929ea54dcf2bc8d2e0428037 (diff)
downloadjustbuild-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/TARGETS1
-rw-r--r--src/buildtool/main/main.cpp4
-rw-r--r--src/buildtool/progress_reporting/TARGETS12
-rw-r--r--src/buildtool/progress_reporting/base_progress_reporter.cpp35
-rw-r--r--src/buildtool/progress_reporting/base_progress_reporter.hpp21
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