mirror of
https://github.com/git/git.git
synced 2026-08-05 07:31:02 +00:00
builtin/maintenance: fix locking with "--detach"
When running git-maintenance(1), we create a lockfile that is supposed to keep other maintenance processes from running at the same time. This lockfile is broken though in case the "--detach" flag is passed: the lockfile is created by the parent process and will be cleaned up either manually or on exit. But when detaching, the parent will exit before all of the background maintenance tasks have been run, and consequently the lock only covers a smaller part of the whole maintenance process. Fix this bug by reassigning all tempfiles from the parent process to the child process when daemonizing so that it becomes the responsibility of the child to clean them up. Note that this is a broader fix, as we now always reassign tempfiles when daemonizing. This is a natural consequence of the semantics of `daemonize()` though, as it essentially promises to continue running the current process in the background. It is thus sensible to have that function perform the whole dance of assigning resources to the child process, including tempfiles. There's only a single other caller in "daemon.c", but that process doesn't create any tempfiles before the call to `daemonize()` and is thus not impacted by this change. Reported-by: Jean-Christophe Manciot <actionmystique@gmail.com> Helped-by: Jeff King <peff@peff.net> Helped-by: Derrick Stolee <stolee@gmail.com> Co-authored-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
94f057755b
commit
6e95b07e5f
15
setup.h
15
setup.h
@@ -149,6 +149,21 @@ void verify_non_filename(const char *prefix, const char *name);
|
||||
int path_inside_repo(const char *prefix, const char *path);
|
||||
|
||||
void sanitize_stdfds(void);
|
||||
|
||||
/*
|
||||
* Daemonize the current process by forking and then exiting the parent
|
||||
* process. Returns 0 when successful, in which case the parent process will
|
||||
* have exited and it's the child process that continues to run the code.
|
||||
* Otherwise, a negative error code is returned and the parent process will
|
||||
* continue execution.
|
||||
*
|
||||
* Note that this function will also perform the following changes:
|
||||
*
|
||||
* - Standard file descriptors in the child process are closed.
|
||||
* - The child process is made a session leader via setsid(3p).
|
||||
* - All tempfiles owned by the parent process are reassigned to the
|
||||
* daemonized child process.
|
||||
*/
|
||||
int daemonize(void);
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user