git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 2/4] run-command: offer to close the object store before running

From
Johannes Schindelin via GitGitGadget <gitgitgadget@gmail.com>
Date
Sep 9, 2021, 09:47 UTC
Message-ID
<df76ee7b77f0a81db32e28eb4c8a253a19e68028.1631180828.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.1035.git.1631180828.gitgitgadget@gmail.com>
From: Johannes Schindelin <johannes.schindelin@gmx.de>

Especially on Windows, where files cannot be deleted if _any_ process holds an open file handle to them, it is important to close the object store (releasing all handles to all `.pack` files) before running a command that might spawn a garbage collection.

This scenario is so common that we frequently see the pattern of closing the object store before running auto maintenance or another Git command.

Let's make this much more convenient by teaching the `run_command()` machinery a new flag to release the object store before spawning the process.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 run-command.c | 5 +++++
 run-command.h | 9 +++++++++
 2 files changed, 14 insertions(+)
diff --git a/run-command.c b/run-command.c
index f72e72cce73..e2dc6243774 100644
--- a/run-command.c
+++ b/run-command.c
@@ -8,6 +8,7 @@
 #include "string-list.h"
 #include "quote.h"
 #include "config.h"
+#include "packfile.h"
 
 void child_process_init(struct child_process *child)
 {
@@ -740,6 +741,9 @@ fail_pipe:
 
 	fflush(NULL);
 
+	if (cmd->close_object_store)
+		close_object_store(the_repository->objects);
+
 #ifndef GIT_WINDOWS_NATIVE
 {
 	int notify_pipe[2];
@@ -1044,6 +1048,7 @@ int run_command_v_opt_cd_env_tr2(const char **argv, int opt, const char *dir,
 	cmd.use_shell = opt & RUN_USING_SHELL ? 1 : 0;
 	cmd.clean_on_exit = opt & RUN_CLEAN_ON_EXIT ? 1 : 0;
 	cmd.wait_after_clean = opt & RUN_WAIT_AFTER_CLEAN ? 1 : 0;
+	cmd.close_object_store = opt & RUN_CLOSE_OBJECT_STORE ? 1 : 0;
 	cmd.dir = dir;
 	cmd.env = env;
 	cmd.trace2_child_class = tr2_class;
diff --git a/run-command.h b/run-command.h
index 3893193f32f..ad207daced7 100644
--- a/run-command.h
+++ b/run-command.h
@@ -134,6 +134,14 @@ struct child_process {
 	 */
 	unsigned use_shell:1;
 
+	/**
+	 * Release any open file handles to the object store before running
+	 * the command; This is necessary e.g. when the spawned process may
+	 * want to repack because that would delete `.pack` files (and on
+	 * Windows, you cannot delete files that are still in use).
+	 */
+	unsigned close_object_store:1;
+
 	unsigned stdout_to_stderr:1;
 	unsigned clean_on_exit:1;
 	unsigned wait_after_clean:1;
@@ -240,6 +248,7 @@ int run_auto_maintenance(int quiet);
 #define RUN_USING_SHELL			(1<<4)
 #define RUN_CLEAN_ON_EXIT		(1<<5)
 #define RUN_WAIT_AFTER_CLEAN		(1<<6)
+#define RUN_CLOSE_OBJECT_STORE		(1<<7)
 
 /**
  * Convenience functions that encapsulate a sequence of
-- 
gitgitgadget
Previous: Johannes Schindelin via GitGitGadgetNext: Johannes Schindelin via GitGitGadget
Message 3 of 5 in “Follow-up to js/pull-release-backs-before-fetching”
  1. 0/4 Follow-up to js/pull-release-backs-before-fetchingJohannes Schindelin via GitGitGadget, Sep 9, 2021
  2. 1/4 run-command: prettify the `RUN_COMMAND_*` flagsJohannes Schindelin via GitGitGadget, Sep 9, 2021
  3. 2/4 run-command: offer to close the object store before runningJohannes Schindelin via GitGitGadget, Sep 9, 2021
  4. 3/4 run_auto_maintenance(): implicitly close the object storeJohannes Schindelin via GitGitGadget, Sep 9, 2021
  5. 4/4 Close object store closer to spawning child processesJohannes Schindelin via GitGitGadget, Sep 9, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.