When git maintenance run --auto encounters an existing
maintenance.lock, it silently skips running maintenance and
returns successfully.
This makes it difficult to identify cases where automatic
maintenance is being skipped repeatedly, for example due to
a stale lock left behind by an interrupted maintenance
process.
Emit a Trace2 data event when automatic maintenance skips
due to an existing lock, allowing users to identify these
skips when Trace2 event logging is enabled.
Signed-off-by: Pushkar Singh <redacted>
---
builtin/gc.c | 2 ++
t/t7900-maintenance.sh | 8 ++++++++
2 files changed, 10 insertions(+)
diff --git a/builtin/gc.c b/builtin/gc.c
index 81cecf6b6c..e73d1f1d49 100644
--- a/builtin/gc.c
+++ b/builtin/gc.c
@@ -1409,6 +1409,8 @@ static int maintenance_run_tasks(struct maintenance_run_opts *opts,
* recursive process stack. Do not report an error in
* that case.
*/
+ if (opts->auto_flag && errno == EEXIST)
+ trace2_data_string("maintenance", r, "lock/skip", "exists");
if (!opts->auto_flag && !opts->quiet)
warning(_("lock file '%s' exists, skipping maintenance"),
lock_path);diff --git a/t/t7900-maintenance.sh b/t/t7900-maintenance.sh
index 9d610a29fe..440eeb956d 100755
--- a/t/t7900-maintenance.sh
+++ b/t/t7900-maintenance.sh
@@ -387,6 +387,14 @@ test_expect_success 'loose-objects task' '
test_cmp packs-between packs-after
'
+test_expect_success 'auto maintenance traces existing lock' '
+ test_when_finished "rm -f trace .git/objects/maintenance.lock" &&
+ : >.git/objects/maintenance.lock &&
+ GIT_TRACE2_EVENT="$PWD/trace" git maintenance run --auto &&
+ test_grep "\"event\":\"data\".*\"category\":\"maintenance\".*\"key\":\"lock/skip\".*\"value\":\"exists\"" trace &&
+ test_path_is_file .git/objects/maintenance.lock
+'
+
test_expect_success 'maintenance.loose-objects.auto' '
git repack -adk &&
GIT_TRACE2_EVENT="$(pwd)/trace-lo1.txt" \
--
2.53.0