From: Patrick Steinhardt <ps@pks.im>
To: Paul Tarjan via GitGitGadget <gitgitgadget@gmail.com>
Cc: git@vger.kernel.org, Paul Tarjan <github@paulisageek.com>
Subject: Re: [PATCH v7 10/10] fsmonitor: close inherited file descriptors and detach in daemon
Date: Wed, 4 Mar 2026 08:43:17 +0100 [thread overview]
Message-ID: <aafilb7FnvWBTQ0J@pks.im> (raw)
In-Reply-To: <4987a009a2e74a04aa1a8deb0508c971a3df0549.1772065643.git.gitgitgadget@gmail.com>
On Thu, Feb 26, 2026 at 12:27:23AM +0000, Paul Tarjan via GitGitGadget wrote:
> From: Paul Tarjan <github@paulisageek.com>
>
> When the fsmonitor daemon is spawned as a background process, it may
> inherit file descriptors from its parent that it does not need. In
> particular, when the test harness or a CI system captures output through
> pipes, the daemon can inherit duplicated pipe endpoints. If the daemon
> holds these open, the parent process never sees EOF and may appear to
> hang.
Oh, interesting.
> Set close_fd_above_stderr on the child process at daemon startup so
> that file descriptors 3 and above are closed before any daemon work
> begins. This ensures the daemon does not inadvertently hold open
> descriptors from its launching environment.
>
> Additionally, call setsid() when the daemon starts with --detach to
> create a new session and process group. Without this, shells that
> enable job control (e.g. bash with "set -m") treat the daemon as part
> of the spawning command's job. Their "wait" builtin then blocks until
> the daemon exits, which it never does. This specifically affects
> systems where /bin/sh is bash (e.g. Fedora), since dash only waits for
> the specific PID rather than the full process group.
Hm. We already have related logic in `daemonize()`. Should we maybe
reuse that function, and potentially expand it to handle closing all FDs
up to the maximum file descriptor?
> Add a 30-second timeout to "fsmonitor--daemon stop" so it does
> not block indefinitely if the daemon fails to shut down.
This feels like a "while-at-it" change to me. Should it maybe be moved
into a separate commit?
> diff --git a/t/meson.build b/t/meson.build
> index 85ef2ae2fa..19e8306298 100644
> --- a/t/meson.build
> +++ b/t/meson.build
> @@ -1210,18 +1210,12 @@ test_environment = script_environment
> test_environment.set('GIT_BUILD_DIR', git_build_dir)
>
> foreach integration_test : integration_tests
> - per_test_kwargs = test_kwargs
> - # The fsmonitor tests start daemon processes that in some environments
> - # can hang. Set a generous timeout to prevent CI from blocking.
> - if fs.stem(integration_test) == 't7527-builtin-fsmonitor'
> - per_test_kwargs += {'timeout': 1800}
> - endif
> test(fs.stem(integration_test), shell,
> args: [ integration_test ],
> workdir: meson.current_source_dir(),
> env: test_environment,
> depends: test_dependencies + bin_wrappers,
> - kwargs: per_test_kwargs,
> + kwargs: test_kwargs,
> )
> endforeach
>
Might make sense to reorder commits a bit so that the fix comes first.
In that case we wouldn't ever have to introduce the timeouts in the
first place.
> diff --git a/t/t7527-builtin-fsmonitor.sh b/t/t7527-builtin-fsmonitor.sh
> index 774da5ac60..d7e64bcb7a 100755
> --- a/t/t7527-builtin-fsmonitor.sh
> +++ b/t/t7527-builtin-fsmonitor.sh
> @@ -766,7 +766,7 @@ do
> else
> test_expect_success "Matrix[uc:$uc_val][fsm:$fsm_val] enable fsmonitor" '
> git config core.fsmonitor true &&
> - git fsmonitor--daemon start &&
> + git fsmonitor--daemon start --start-timeout=10 &&
> git update-index --fsmonitor
> '
> fi
This change feels unrelated and is not mentioned in the commit message.
> @@ -997,7 +997,17 @@ start_git_in_background () {
> nr_tries_left=$(($nr_tries_left - 1))
> done >/dev/null 2>&1 3>&- 4>&- 5>&- 6>&- 7>&- &
> watchdog_pid=$!
> +
> + # Disable job control before wait. With "set -m", bash treats
> + # "wait $pid" as waiting for the entire job (process group),
> + # which blocks indefinitely if the fsmonitor daemon was spawned
> + # into the same process group and is still running. Turning off
> + # job control makes "wait" only wait for the specific PID.
> + set +m &&
> wait $git_pid
> + wait_status=$?
> + set -m
> + return $wait_status
> }
I thought with our call to setsid() we're not part of the same process
group anymore. So why is this change here still needed?
Patrick
next prev parent reply other threads:[~2026-03-04 7:43 UTC|newest]
Thread overview: 129+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-30 8:14 [PATCH] fsmonitor: implement filesystem change listener for Linux Paul Tarjan via GitGitGadget
2025-12-30 11:38 ` Junio C Hamano
2025-12-30 12:08 ` [PATCH v2] " Paul Tarjan via GitGitGadget
2025-12-30 12:55 ` [PATCH v3] " Paul Tarjan via GitGitGadget
2025-12-31 17:41 ` [PATCH v4] " Paul Tarjan via GitGitGadget
2026-01-05 12:07 ` Patrick Steinhardt
2026-02-20 22:18 ` Junio C Hamano
2026-02-21 16:15 ` Paul Tarjan
2026-02-21 17:07 ` Junio C Hamano
2026-02-23 6:34 ` Patrick Steinhardt
2026-02-23 15:42 ` Junio C Hamano
2026-02-23 15:46 ` Patrick Steinhardt
2026-02-24 1:34 ` Paul Tarjan
2026-02-24 8:03 ` Patrick Steinhardt
2026-02-24 1:31 ` [PATCH v5] " Paul Tarjan via GitGitGadget
2026-02-24 8:03 ` Patrick Steinhardt
2026-02-25 20:17 ` [PATCH v6 00/10] " Paul Tarjan via GitGitGadget
2026-02-25 20:17 ` [PATCH v6 01/10] fsmonitor: fix khash memory leak in do_handle_client Paul Tarjan via GitGitGadget
2026-02-25 21:01 ` Junio C Hamano
2026-02-25 20:17 ` [PATCH v6 02/10] fsmonitor: fix hashmap memory leak in fsmonitor_run_daemon Paul Tarjan via GitGitGadget
2026-02-25 20:17 ` [PATCH v6 03/10] compat/win32: add pthread_cond_timedwait Paul Tarjan via GitGitGadget
2026-02-25 20:17 ` [PATCH v6 04/10] fsmonitor: use pthread_cond_timedwait for cookie wait Paul Tarjan via GitGitGadget
2026-02-25 21:13 ` Junio C Hamano
2026-02-27 6:31 ` Paul Tarjan
2026-02-27 16:44 ` Junio C Hamano
2026-02-28 0:28 ` Paul Tarjan
2026-02-25 21:17 ` Junio C Hamano
2026-02-27 6:31 ` Paul Tarjan
2026-02-25 20:17 ` [PATCH v6 05/10] fsmonitor: deduplicate IPC path logic for Unix platforms Paul Tarjan via GitGitGadget
2026-02-25 21:30 ` Junio C Hamano
2026-02-27 6:31 ` Paul Tarjan
2026-02-25 20:17 ` [PATCH v6 06/10] fsmonitor: deduplicate settings " Paul Tarjan via GitGitGadget
2026-02-25 21:31 ` Junio C Hamano
2026-02-27 6:31 ` Paul Tarjan
2026-02-25 20:17 ` [PATCH v6 07/10] fsmonitor: implement filesystem change listener for Linux Paul Tarjan via GitGitGadget
2026-02-25 20:17 ` [PATCH v6 08/10] fsmonitor: add tests " Paul Tarjan via GitGitGadget
2026-02-25 20:17 ` [PATCH v6 09/10] run-command: add close_fd_above_stderr option Paul Tarjan via GitGitGadget
2026-02-25 21:41 ` Junio C Hamano
2026-02-25 20:17 ` [PATCH v6 10/10] fsmonitor: close inherited file descriptors and detach in daemon Paul Tarjan via GitGitGadget
2026-02-26 0:27 ` [PATCH v7 00/10] fsmonitor: implement filesystem change listener for Linux Paul Tarjan via GitGitGadget
2026-02-26 0:27 ` [PATCH v7 01/10] fsmonitor: fix khash memory leak in do_handle_client Paul Tarjan via GitGitGadget
2026-03-04 7:42 ` Patrick Steinhardt
2026-03-04 18:17 ` Paul Tarjan
2026-02-26 0:27 ` [PATCH v7 02/10] fsmonitor: fix hashmap memory leak in fsmonitor_run_daemon Paul Tarjan via GitGitGadget
2026-03-04 7:42 ` Patrick Steinhardt
2026-03-04 18:17 ` Paul Tarjan
2026-02-26 0:27 ` [PATCH v7 03/10] compat/win32: add pthread_cond_timedwait Paul Tarjan via GitGitGadget
2026-03-04 7:42 ` Patrick Steinhardt
2026-03-04 18:17 ` Paul Tarjan
2026-02-26 0:27 ` [PATCH v7 04/10] fsmonitor: use pthread_cond_timedwait for cookie wait Paul Tarjan via GitGitGadget
2026-03-04 7:42 ` Patrick Steinhardt
2026-03-04 18:17 ` Paul Tarjan
2026-02-26 0:27 ` [PATCH v7 05/10] fsmonitor: deduplicate IPC path logic for Unix platforms Paul Tarjan via GitGitGadget
2026-03-04 7:42 ` Patrick Steinhardt
2026-03-04 18:17 ` Paul Tarjan
2026-02-26 0:27 ` [PATCH v7 06/10] fsmonitor: deduplicate settings " Paul Tarjan via GitGitGadget
2026-03-04 7:43 ` Patrick Steinhardt
2026-03-04 18:17 ` Paul Tarjan
2026-02-26 0:27 ` [PATCH v7 07/10] fsmonitor: implement filesystem change listener for Linux Paul Tarjan via GitGitGadget
2026-03-04 7:43 ` Patrick Steinhardt
2026-03-04 18:17 ` Paul Tarjan
2026-02-26 0:27 ` [PATCH v7 08/10] fsmonitor: add tests " Paul Tarjan via GitGitGadget
2026-03-04 7:43 ` Patrick Steinhardt
2026-03-04 18:17 ` Paul Tarjan
2026-02-26 0:27 ` [PATCH v7 09/10] run-command: add close_fd_above_stderr option Paul Tarjan via GitGitGadget
2026-02-26 0:27 ` [PATCH v7 10/10] fsmonitor: close inherited file descriptors and detach in daemon Paul Tarjan via GitGitGadget
2026-03-04 7:43 ` Patrick Steinhardt [this message]
2026-03-04 18:17 ` Paul Tarjan
2026-02-26 15:34 ` [PATCH v7 00/10] fsmonitor: implement filesystem change listener for Linux Junio C Hamano
2026-03-04 18:15 ` [PATCH v8 00/12] " Paul Tarjan via GitGitGadget
2026-03-04 18:15 ` [PATCH v8 01/12] fsmonitor: fix khash memory leak in do_handle_client Paul Tarjan via GitGitGadget
2026-03-04 18:15 ` [PATCH v8 02/12] fsmonitor: fix hashmap memory leak in fsmonitor_run_daemon Paul Tarjan via GitGitGadget
2026-03-04 18:15 ` [PATCH v8 03/12] compat/win32: add pthread_cond_timedwait Paul Tarjan via GitGitGadget
2026-03-04 18:15 ` [PATCH v8 04/12] fsmonitor: use pthread_cond_timedwait for cookie wait Paul Tarjan via GitGitGadget
2026-03-04 18:15 ` [PATCH v8 05/12] fsmonitor: rename fsm-ipc-darwin.c to fsm-ipc-unix.c Paul Tarjan via GitGitGadget
2026-03-04 18:15 ` [PATCH v8 06/12] fsmonitor: rename fsm-settings-darwin.c to fsm-settings-unix.c Paul Tarjan via GitGitGadget
2026-03-04 18:15 ` [PATCH v8 07/12] fsmonitor: implement filesystem change listener for Linux Paul Tarjan via GitGitGadget
2026-03-04 18:15 ` [PATCH v8 08/12] run-command: add close_fd_above_stderr option Paul Tarjan via GitGitGadget
2026-03-04 20:51 ` Junio C Hamano
2026-03-05 0:49 ` [PATCH v8 09/12] " Paul Tarjan
2026-03-05 4:13 ` Junio C Hamano
2026-03-05 6:38 ` [PATCH v9 09/12] run-command: add pre-exec callback for child processes Paul Tarjan
2026-03-04 18:15 ` [PATCH v8 09/12] fsmonitor: close inherited file descriptors and detach in daemon Paul Tarjan via GitGitGadget
2026-03-04 18:15 ` [PATCH v8 10/12] fsmonitor: add timeout to daemon stop command Paul Tarjan via GitGitGadget
2026-03-04 18:15 ` [PATCH v8 11/12] fsmonitor: add tests for Linux Paul Tarjan via GitGitGadget
2026-03-04 18:15 ` [PATCH v8 12/12] fsmonitor: convert shown khash to strset in do_handle_client Paul Tarjan via GitGitGadget
2026-03-05 0:51 ` [PATCH v9 00/12] fsmonitor: implement filesystem change listener for Linux Paul Tarjan via GitGitGadget
2026-03-05 0:51 ` [PATCH v9 01/12] fsmonitor: fix khash memory leak in do_handle_client Paul Tarjan via GitGitGadget
2026-03-05 0:51 ` [PATCH v9 02/12] fsmonitor: fix hashmap memory leak in fsmonitor_run_daemon Paul Tarjan via GitGitGadget
2026-03-05 0:51 ` [PATCH v9 03/12] compat/win32: add pthread_cond_timedwait Paul Tarjan via GitGitGadget
2026-03-05 0:51 ` [PATCH v9 04/12] fsmonitor: use pthread_cond_timedwait for cookie wait Paul Tarjan via GitGitGadget
2026-03-05 0:51 ` [PATCH v9 05/12] fsmonitor: rename fsm-ipc-darwin.c to fsm-ipc-unix.c Paul Tarjan via GitGitGadget
2026-03-05 0:51 ` [PATCH v9 06/12] fsmonitor: rename fsm-settings-darwin.c to fsm-settings-unix.c Paul Tarjan via GitGitGadget
2026-03-05 0:51 ` [PATCH v9 07/12] fsmonitor: implement filesystem change listener for Linux Paul Tarjan via GitGitGadget
2026-03-05 0:51 ` [PATCH v9 08/12] run-command: add pre-exec callback for child processes Paul Tarjan via GitGitGadget
2026-03-05 0:51 ` [PATCH v9 09/12] fsmonitor: close inherited file descriptors and detach in daemon Paul Tarjan via GitGitGadget
2026-03-05 0:51 ` [PATCH v9 10/12] fsmonitor: add timeout to daemon stop command Paul Tarjan via GitGitGadget
2026-03-05 0:51 ` [PATCH v9 11/12] fsmonitor: add tests for Linux Paul Tarjan via GitGitGadget
2026-03-05 0:52 ` [PATCH v9 12/12] fsmonitor: convert shown khash to strset in do_handle_client Paul Tarjan via GitGitGadget
2026-03-05 1:16 ` [PATCH v10 00/12] fsmonitor: implement filesystem change listener for Linux Paul Tarjan via GitGitGadget
2026-03-05 1:16 ` [PATCH v10 01/12] fsmonitor: fix khash memory leak in do_handle_client Paul Tarjan via GitGitGadget
2026-03-05 1:16 ` [PATCH v10 02/12] fsmonitor: fix hashmap memory leak in fsmonitor_run_daemon Paul Tarjan via GitGitGadget
2026-03-05 1:16 ` [PATCH v10 03/12] compat/win32: add pthread_cond_timedwait Paul Tarjan via GitGitGadget
2026-03-05 1:16 ` [PATCH v10 04/12] fsmonitor: use pthread_cond_timedwait for cookie wait Paul Tarjan via GitGitGadget
2026-03-05 1:16 ` [PATCH v10 05/12] fsmonitor: rename fsm-ipc-darwin.c to fsm-ipc-unix.c Paul Tarjan via GitGitGadget
2026-03-05 1:16 ` [PATCH v10 06/12] fsmonitor: rename fsm-settings-darwin.c to fsm-settings-unix.c Paul Tarjan via GitGitGadget
2026-03-05 1:16 ` [PATCH v10 07/12] fsmonitor: implement filesystem change listener for Linux Paul Tarjan via GitGitGadget
2026-03-05 1:16 ` [PATCH v10 08/12] run-command: add pre-exec callback for child processes Paul Tarjan via GitGitGadget
2026-03-05 1:16 ` [PATCH v10 09/12] fsmonitor: close inherited file descriptors and detach in daemon Paul Tarjan via GitGitGadget
2026-03-05 1:16 ` [PATCH v10 10/12] fsmonitor: add timeout to daemon stop command Paul Tarjan via GitGitGadget
2026-03-05 1:16 ` [PATCH v10 11/12] fsmonitor: add tests for Linux Paul Tarjan via GitGitGadget
2026-03-05 1:16 ` [PATCH v10 12/12] fsmonitor: convert shown khash to strset in do_handle_client Paul Tarjan via GitGitGadget
2026-03-05 6:55 ` [PATCH v11 00/12] fsmonitor: implement filesystem change listener for Linux Paul Tarjan via GitGitGadget
2026-03-05 6:55 ` [PATCH v11 01/12] fsmonitor: fix khash memory leak in do_handle_client Paul Tarjan via GitGitGadget
2026-03-05 6:55 ` [PATCH v11 02/12] fsmonitor: fix hashmap memory leak in fsmonitor_run_daemon Paul Tarjan via GitGitGadget
2026-03-05 6:55 ` [PATCH v11 03/12] compat/win32: add pthread_cond_timedwait Paul Tarjan via GitGitGadget
2026-03-05 6:55 ` [PATCH v11 04/12] fsmonitor: use pthread_cond_timedwait for cookie wait Paul Tarjan via GitGitGadget
2026-03-05 6:55 ` [PATCH v11 05/12] fsmonitor: rename fsm-ipc-darwin.c to fsm-ipc-unix.c Paul Tarjan via GitGitGadget
2026-03-05 6:55 ` [PATCH v11 06/12] fsmonitor: rename fsm-settings-darwin.c to fsm-settings-unix.c Paul Tarjan via GitGitGadget
2026-03-05 6:55 ` [PATCH v11 07/12] fsmonitor: implement filesystem change listener for Linux Paul Tarjan via GitGitGadget
2026-03-05 6:55 ` [PATCH v11 08/12] run-command: add close_fd_above_stderr option Paul Tarjan via GitGitGadget
2026-03-05 6:55 ` [PATCH v11 09/12] fsmonitor: close inherited file descriptors and detach in daemon Paul Tarjan via GitGitGadget
2026-03-05 6:55 ` [PATCH v11 10/12] fsmonitor: add timeout to daemon stop command Paul Tarjan via GitGitGadget
2026-03-05 6:55 ` [PATCH v11 11/12] fsmonitor: add tests for Linux Paul Tarjan via GitGitGadget
2026-03-05 6:55 ` [PATCH v11 12/12] fsmonitor: convert shown khash to strset in do_handle_client Paul Tarjan via GitGitGadget
2026-03-05 7:37 ` [PATCH v11 00/12] fsmonitor: implement filesystem change listener for Linux Patrick Steinhardt
2026-03-05 14:15 ` Paul Tarjan
2026-03-25 20:00 ` Junio C Hamano
2025-12-30 15:37 ` [PATCH v2] " Junio C Hamano
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=aafilb7FnvWBTQ0J@pks.im \
--to=ps@pks.im \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=github@paulisageek.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
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