From: "Paul Tarjan via GitGitGadget" <gitgitgadget@gmail•com>
To: git@vger•kernel.org
Cc: Paul Tarjan <github@paulisageek•com>,
Paul Tarjan <github@paulisageek•com>
Subject: [PATCH] t7527: fix flaky fsmonitor event tests with retry logic
Date: Wed, 31 Dec 2025 23:40:11 +0000 [thread overview]
Message-ID: <pull.2150.git.git.1767224411233.gitgitgadget@gmail.com> (raw)
From: Paul Tarjan <github@paulisageek•com>
The fsmonitor event tests (edit, create, delete, rename, etc.) were
flaky because there can be a race between the daemon writing events
to the trace file and the test's grep commands checking for them.
Add a retry_grep() helper function (similar to retry_until_success
in lib-git-p4.sh) that retries grep with a timeout, and use it in
all event-checking tests to wait for one expected event before
checking the rest.
Signed-off-by: Paul Tarjan <github@paulisageek•com>
---
t7527: fix flaky fsmonitor event tests with retry logic
This failed in
https://github.com/git/git/actions/runs/20628166110/job/59242063331 on
an unrelated commit.
The fsmonitor event tests (edit, create, delete, rename, etc.) were
flaky because there can be a race between the daemon writing events to
the trace file and the test's grep commands checking for them.
Add a retry_grep() helper function (similar to retry_until_success in
lib-git-p4.sh) that retries grep with a timeout, and use it in all
event-checking tests to wait for one expected event before checking the
rest.
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-2150%2Fptarjan%2Fclaude%2Ffix-fsmonitor-test-jsXoE-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-2150/ptarjan/claude/fix-fsmonitor-test-jsXoE-v1
Pull-Request: https://github.com/git/git/pull/2150
t/t7527-builtin-fsmonitor.sh | 51 +++++++++++++++++++-----------------
1 file changed, 27 insertions(+), 24 deletions(-)
diff --git a/t/t7527-builtin-fsmonitor.sh b/t/t7527-builtin-fsmonitor.sh
index 409cd0cd12..68a10a2100 100755
--- a/t/t7527-builtin-fsmonitor.sh
+++ b/t/t7527-builtin-fsmonitor.sh
@@ -408,9 +408,8 @@ move_directory() {
# ensure we are getting the OS notifications and do not try to confirm what
# is reported by `git status`.
#
-# We run a simple query after modifying the filesystem just to introduce
-# a bit of a delay so that the trace logging from the daemon has time to
-# get flushed to disk.
+# We use retry_grep to handle races between the daemon writing events
+# to the trace file and our check.
#
# We `reset` and `clean` at the bottom of each test (and before stopping the
# daemon) because these commands might implicitly restart the daemon.
@@ -422,6 +421,24 @@ clean_up_repo_and_stop_daemon () {
rm -f .git/trace
}
+# Retry a grep up to RETRY_TIMEOUT times until it succeeds.
+#
+RETRY_TIMEOUT=5
+
+retry_grep () {
+ nr_tries_left=$RETRY_TIMEOUT
+ until grep "$1" "$2" 2>/dev/null
+ do
+ if test $nr_tries_left -eq 0
+ then
+ grep "$1" "$2"
+ return
+ fi
+ nr_tries_left=$(($nr_tries_left - 1))
+ sleep 1
+ done
+}
+
test_expect_success 'edit some files' '
test_when_finished clean_up_repo_and_stop_daemon &&
@@ -429,9 +446,7 @@ test_expect_success 'edit some files' '
edit_files &&
- test-tool fsmonitor-client query --token 0 &&
-
- grep "^event: dir1/modified$" .git/trace &&
+ retry_grep "^event: dir1/modified$" .git/trace &&
grep "^event: dir2/modified$" .git/trace &&
grep "^event: modified$" .git/trace &&
grep "^event: dir1/untracked$" .git/trace
@@ -444,9 +459,7 @@ test_expect_success 'create some files' '
create_files &&
- test-tool fsmonitor-client query --token 0 &&
-
- grep "^event: dir1/new$" .git/trace &&
+ retry_grep "^event: dir1/new$" .git/trace &&
grep "^event: dir2/new$" .git/trace &&
grep "^event: new$" .git/trace
'
@@ -458,9 +471,7 @@ test_expect_success 'delete some files' '
delete_files &&
- test-tool fsmonitor-client query --token 0 &&
-
- grep "^event: dir1/delete$" .git/trace &&
+ retry_grep "^event: dir1/delete$" .git/trace &&
grep "^event: dir2/delete$" .git/trace &&
grep "^event: delete$" .git/trace
'
@@ -472,9 +483,7 @@ test_expect_success 'rename some files' '
rename_files &&
- test-tool fsmonitor-client query --token 0 &&
-
- grep "^event: dir1/rename$" .git/trace &&
+ retry_grep "^event: dir1/rename$" .git/trace &&
grep "^event: dir2/rename$" .git/trace &&
grep "^event: rename$" .git/trace &&
grep "^event: dir1/renamed$" .git/trace &&
@@ -489,9 +498,7 @@ test_expect_success 'rename directory' '
mv dirtorename dirrenamed &&
- test-tool fsmonitor-client query --token 0 &&
-
- grep "^event: dirtorename/*$" .git/trace &&
+ retry_grep "^event: dirtorename/*$" .git/trace &&
grep "^event: dirrenamed/*$" .git/trace
'
@@ -502,9 +509,7 @@ test_expect_success 'file changes to directory' '
file_to_directory &&
- test-tool fsmonitor-client query --token 0 &&
-
- grep "^event: delete$" .git/trace &&
+ retry_grep "^event: delete$" .git/trace &&
grep "^event: delete/new$" .git/trace
'
@@ -515,9 +520,7 @@ test_expect_success 'directory changes to a file' '
directory_to_file &&
- test-tool fsmonitor-client query --token 0 &&
-
- grep "^event: dir1$" .git/trace
+ retry_grep "^event: dir1$" .git/trace
'
# The next few test cases exercise the token-resync code. When filesystem
base-commit: 68cb7f9e92a5d8e9824f5b52ac3d0a9d8f653dbe
--
gitgitgadget
next reply other threads:[~2025-12-31 23:40 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-31 23:40 Paul Tarjan via GitGitGadget [this message]
2026-01-01 0:19 ` [PATCH v2] t7527: fix flaky fsmonitor event tests with retry logic Paul Tarjan via GitGitGadget
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.2150.git.git.1767224411233.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail$(echo .)com \
--cc=git@vger$(echo .)kernel.org \
--cc=github@paulisageek$(echo .)com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox