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

[PATCH v3 16/21] read-cache: unlink old sharedindex files

From
Christian Couder <christian.couder@gmail.com>
Date
Dec 26, 2016, 10:22 UTC
Message-ID
<20161226102222.17150-17-chriscool@tuxfamily.org>
In-Reply-To
<20161226102222.17150-1-chriscool@tuxfamily.org>

Everytime split index is turned on, it creates a "sharedindex.XXXX" file in the git directory. This change makes sure that shared index files that haven't been used for a long time are removed when a new shared index file is created.

The new "splitIndex.sharedIndexExpire" config variable is created to tell the delay after which an unused shared index file can be deleted. It defaults to "1.week.ago".

A previous commit made sure that each time a split index file is created the mtime of the shared index file it references is updated. This makes sure that recently used shared index file will not be deleted.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
 read-cache.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 63 insertions(+), 1 deletion(-)
diff --git a/read-cache.c b/read-cache.c
index 9fbad2044b..e62a6c742d 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -2207,6 +2207,65 @@ static int write_split_index(struct index_state *istate,
 	return ret;
 }
 
+static const char *shared_index_expire = "1.week.ago";
+
+static unsigned long get_shared_index_expire_date(void)
+{
+	static unsigned long shared_index_expire_date;
+	static int shared_index_expire_date_prepared;
+
+	if (!shared_index_expire_date_prepared) {
+		git_config_get_expiry("splitindex.sharedindexexpire",
+				      &shared_index_expire);
+		shared_index_expire_date = approxidate(shared_index_expire);
+		shared_index_expire_date_prepared = 1;
+	}
+
+	return shared_index_expire_date;
+}
+
+static int can_delete_shared_index(const char *shared_index_path)
+{
+	struct stat st;
+	unsigned long expiration;
+
+	/* Check timestamp */
+	expiration = get_shared_index_expire_date();
+	if (!expiration)
+		return 0;
+	if (stat(shared_index_path, &st))
+		return error_errno(_("could not stat '%s"), shared_index_path);
+	if (st.st_mtime > expiration)
+		return 0;
+
+	return 1;
+}
+
+static int clean_shared_index_files(const char *current_hex)
+{
+	struct dirent *de;
+	DIR *dir = opendir(get_git_dir());
+
+	if (!dir)
+		return error_errno(_("unable to open git dir: %s"), get_git_dir());
+
+	while ((de = readdir(dir)) != NULL) {
+		const char *sha1_hex;
+		const char *shared_index_path;
+		if (!skip_prefix(de->d_name, "sharedindex.", &sha1_hex))
+			continue;
+		if (!strcmp(sha1_hex, current_hex))
+			continue;
+		shared_index_path = git_path("%s", de->d_name);
+		if (can_delete_shared_index(shared_index_path) > 0 &&
+		    unlink(shared_index_path))
+			error_errno(_("unable to unlink: %s"), shared_index_path);
+	}
+	closedir(dir);
+
+	return 0;
+}
+
 static struct tempfile temporary_sharedindex;
 
 static int write_shared_index(struct index_state *istate,
@@ -2228,8 +2287,11 @@ static int write_shared_index(struct index_state *istate,
 	}
 	ret = rename_tempfile(&temporary_sharedindex,
 			      git_path("sharedindex.%s", sha1_to_hex(si->base->sha1)));
-	if (!ret)
+	if (!ret) {
 		hashcpy(si->base_sha1, si->base->sha1);
+		clean_shared_index_files(sha1_to_hex(si->base->sha1));
+	}
+
 	return ret;
 }
 
-- 
2.11.0.209.gda91e66374.dirty
Previous: Christian CouderNext: Christian Couder
Message 25 of 56 in “Add configuration options for split-index”
  1. 00/21 Add configuration options for split-indexChristian Couder, Dec 26, 2016
  2. 01/21 config: mark an error message up for translationChristian Couder, Dec 26, 2016
  3. 02/21 config: add git_config_get_split_index()Christian Couder, Dec 26, 2016
  4. 03/21 split-index: add {add,remove}_split_index() functionsChristian Couder, Dec 26, 2016
  5. 04/21 read-cache: add and then use tweak_split_index()Christian Couder, Dec 26, 2016
  6. 09/21 config: add git_config_get_max_percent_split_change()Christian Couder, Dec 26, 2016
  7. 10/21 read-cache: regenerate shared index if necessaryChristian Couder, Dec 26, 2016
  8. Junio C HamanoDec 27, 2016
  9. Christian CouderJan 2, 2017
  10. 05/21 update-index: warn in case of split-index incoherencyChristian Couder, Dec 26, 2016
  11. 11/21 t1700: add tests for splitIndex.maxPercentChangeChristian Couder, Dec 26, 2016
  12. 15/21 config: add git_config_get_expiry() from gc.cChristian Couder, Dec 26, 2016
  13. 12/21 Documentation/config: add splitIndex.maxPercentChangeChristian Couder, Dec 26, 2016
  14. Junio C HamanoDec 27, 2016
  15. Christian CouderJan 2, 2017
  16. 19/21 read-cache: use freshen_shared_index() in read_index_from()Christian Couder, Dec 26, 2016
  17. 20/21 Documentation/config: add splitIndex.sharedIndexExpireChristian Couder, Dec 26, 2016
  18. Junio C HamanoDec 27, 2016
  19. Christian CouderJan 2, 2017
  20. 17/21 t1700: test shared index file expirationChristian Couder, Dec 26, 2016
  21. 21/21 Documentation/git-update-index: explain splitIndex.*Christian Couder, Dec 26, 2016
  22. Junio C HamanoDec 27, 2016
  23. Christian CouderJan 2, 2017
  24. 18/21 read-cache: refactor read_index_from()Christian Couder, Dec 26, 2016
  25. 16/21 read-cache: unlink old sharedindex filesChristian Couder, Dec 26, 2016
  26. 14/21 read-cache: touch shared index files when usedChristian Couder, Dec 26, 2016
  27. Junio C HamanoDec 27, 2016
  28. Christian CouderJan 2, 2017
  29. Junio C HamanoJan 7, 2017
  30. Duy NguyenJan 9, 2017
  31. Junio C HamanoJan 9, 2017
  32. Duy NguyenJan 19, 2017
  33. Junio C HamanoJan 19, 2017
  34. Duy NguyenJan 20, 2017
  35. Christian CouderJan 23, 2017
  36. Junio C HamanoJan 23, 2017
  37. Christian CouderJan 25, 2017
  38. Junio C HamanoJan 25, 2017
  39. Christian CouderJan 31, 2017
  40. Junio C HamanoJan 31, 2017
  41. Junio C HamanoJan 31, 2017
  42. 13/21 sha1_file: make check_and_freshen_file() non staticChristian Couder, Dec 26, 2016
  43. Junio C HamanoDec 27, 2016
  44. 07/21 Documentation/config: add information for core.splitIndexChristian Couder, Dec 26, 2016
  45. 08/21 Documentation/git-update-index: talk about core.splitIndex config varChristian Couder, Dec 26, 2016
  46. Junio C HamanoDec 27, 2016
  47. Christian CouderJan 2, 2017
  48. Junio C HamanoJan 7, 2017
  49. Duy NguyenJan 9, 2017
  50. Christian CouderJan 23, 2017
  51. Junio C HamanoJan 23, 2017
  52. 06/21 t1700: add tests for core.splitIndexChristian Couder, Dec 26, 2016
  53. Junio C HamanoDec 27, 2016
  54. Christian CouderJan 2, 2017
  55. Junio C HamanoJan 3, 2017
  56. Christian CouderDec 26, 2016

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.