[PATCH 2/7] progress: catch nested/overlapping progresses with GIT_TEST_CHECK_PROGRESS
STALE1704d
From: SZEDER Gábor <hidden>
Date: 2021-06-20 20:03:28
Subsystem:
the rest · Maintainer:
Linus Torvalds
We had to fix two buggy progress lines in the past, where
stop_progress calls were added at the wrong place [1], resulting in
"done" progress lines appearing in the wrong order.
Extend GIT_TEST_CHECK_PROGRESS to catch these cases as well, i.e.
trigger a BUG() when a progress has already been running when
start_progress() or one of its variants is called to start a new one.
Running the test suite with GIT_TEST_CHECK_PROGRESS enabled doesn't
reveal any new issues [2].
Note that this will trigger even in cases where the output is not
visibly wrong, e.g. consider this simplified sequence of calls:
progress1 = start_delayed_progress();
progress2 = start_delayed_progress();
for (i = 0; ...)
display_progress(progress2, i + 1);
stop_progres(&progress2);
for (j = 0; ...)
display_progress(progress1, j + 1);
stop_progres(&progress1);
This doesn't produce bogus output like what is shown in those two
fixes [1], because 'progress2' is already "done" before the first
display_progress(progress1, ...) call. Btw, this is not just a
pathological example, we do have two progress lines arranged like
this, but they are only shown when standard error is a terminal, and
thus aren't caught by GIT_TEST_CHECK_PROGRESS in its current form.
[1] 6f9d5f2fda (commit-graph: fix progress of reachable commits,
2020-07-09)
862aead24e (commit-graph: fix "Collecting commits from input"
progress line, 2020-07-10)
[2] This patch series applies with a minor conflict on top of
6f9d5f2fda^, and makes 37 tests fail because of that bug.
Signed-off-by: SZEDER Gábor <redacted>
---
progress.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/progress.c b/progress.c
index 255995406f..549e8d1fe7 100644
--- a/progress.c
+++ b/progress.c@@ -48,6 +48,8 @@ struct progress { static volatile sig_atomic_t progress_update; static int test_check_progress; +/* Used to catch nested/overlapping progresses with GIT_TEST_CHECK_PROGRESS. */ +static struct progress *current_progress = NULL; /* * These are only intended for testing the progress output, i.e. exclusively
@@ -258,8 +260,12 @@ static struct progress *start_progress_delay(const char *title, uint64_t total, struct progress *progress; test_check_progress = git_env_bool("GIT_TEST_CHECK_PROGRESS", 0); + if (test_check_progress && current_progress) + BUG("progress \"%s\" is still active when starting new progress \"%s\"", + current_progress->title, title); progress = xmalloc(sizeof(*progress)); + current_progress = progress; progress->title = title; progress->total = total; progress->last_value = -1;
@@ -383,6 +389,7 @@ void stop_progress_msg(struct progress **p_progress, const char *msg) strbuf_release(&progress->counters_sb); if (progress->throughput) strbuf_release(&progress->throughput->display); + current_progress = NULL; free(progress->throughput); free(progress); }
--
2.32.0.289.g44fbea0957