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

[PATCH v2 5/7] gc: handle a corner case in gc.bigPackThreshold

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Apr 15, 2018, 15:36 UTC
Message-ID
<20180415153618.32019-6-pclouds@gmail.com>
In-Reply-To
<20180415153618.32019-1-pclouds@gmail.com>

This config allows us to keep <N> packs back if their size is larger than a limit. But if this N >= gc.autoPackLimit, we may have a problem. We are supposed to reduce the number of packs after a threshold because it affects performance.

We could tell the user that they have incompatible gc.bigPackThreshold and gc.autoPackLimit, but it's kinda hard when 'git gc --auto' runs in background. Instead let's fall back to the next best stategy: try to reduce the number of packs anyway, but keep the base pack out. This reduces the number of packs to two and hopefully won't take up too much resources to repack (the assumption still is the base pack takes most resources to handle).

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 Documentation/config.txt | 5 +++++
 builtin/gc.c             | 8 +++++++-
 2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 728ae902e6..4c3f1d7651 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -1564,6 +1564,11 @@ gc.bigPackThreshold::
 	except that all packs that meet the threshold are kept, not
 	just the base pack. Defaults to zero. Common unit suffixes of
 	'k', 'm', or 'g' are supported.
++
+Note that if the number of kept packs is more than gc.autoPackLimit,
+this configuration variable is ignored, all packs except the base pack
+will be repacked. After this the number of packs should go below
+gc.autoPackLimit and gc.bigPackThreshold should be respected again.
 
 gc.logExpiry::
 	If the file gc.log exists, then `git gc --auto` won't run
diff --git a/builtin/gc.c b/builtin/gc.c
index 81ecdc5ffa..23c17ba7e9 100644
--- a/builtin/gc.c
+++ b/builtin/gc.c
@@ -253,8 +253,14 @@ static int need_to_gc(void)
 	if (too_many_packs()) {
 		struct string_list keep_pack = STRING_LIST_INIT_NODUP;
 
-		if (big_pack_threshold)
+		if (big_pack_threshold) {
 			find_base_packs(&keep_pack, big_pack_threshold);
+			if (keep_pack.nr >= gc_auto_pack_limit) {
+				big_pack_threshold = 0;
+				string_list_clear(&keep_pack, 0);
+				find_base_packs(&keep_pack, 0);
+			}
+		}
 
 		add_repack_all_option(&keep_pack);
 		string_list_clear(&keep_pack, 0);
-- 
2.17.0.367.g5dd2e386c3
Previous: Nguyễn Thái Ngọc DuyNext: Nguyễn Thái Ngọc Duy
Message 14 of 19 in “nd/repack-keep-pack update”
  1. 0/7 nd/repack-keep-pack updateNguyễn Thái Ngọc Duy, Apr 14, 2018
  2. 3/7 gc: add --keep-largest-pack optionNguyễn Thái Ngọc Duy, Apr 14, 2018
  3. 2/7 repack: add --keep-pack optionNguyễn Thái Ngọc Duy, Apr 14, 2018
  4. 7/7 pack-objects: show some progress when counting kept objectsNguyễn Thái Ngọc Duy, Apr 14, 2018
  5. 5/7 gc: handle a corner case in gc.bigPackThresholdNguyễn Thái Ngọc Duy, Apr 14, 2018
  6. 6/7 gc --auto: exclude base pack if not enough mem to "repack -ad"Nguyễn Thái Ngọc Duy, Apr 14, 2018
  7. 4/7 gc: add gc.bigPackThreshold configNguyễn Thái Ngọc Duy, Apr 14, 2018
  8. 1/7 t7700: have closing quote of a test at the beginning of lineNguyễn Thái Ngọc Duy, Apr 14, 2018
  9. Ævar Arnfjörð BjarmasonApr 14, 2018
  10. Junio C HamanoApr 14, 2018
  11. 0/7 nd/repack-keep-pack updateNguyễn Thái Ngọc Duy, Apr 15, 2018
  12. 1/7 t7700: have closing quote of a test at the beginning of lineNguyễn Thái Ngọc Duy, Apr 15, 2018
  13. 2/7 repack: add --keep-pack optionNguyễn Thái Ngọc Duy, Apr 15, 2018
  14. 5/7 gc: handle a corner case in gc.bigPackThresholdNguyễn Thái Ngọc Duy, Apr 15, 2018
  15. 7/7 pack-objects: show some progress when counting kept objectsNguyễn Thái Ngọc Duy, Apr 15, 2018
  16. 6/7 gc --auto: exclude base pack if not enough mem to "repack -ad"Nguyễn Thái Ngọc Duy, Apr 15, 2018
  17. 3/7 gc: add --keep-largest-pack optionNguyễn Thái Ngọc Duy, Apr 15, 2018
  18. 4/7 gc: add gc.bigPackThreshold configNguyễn Thái Ngọc Duy, Apr 15, 2018
  19. Junio C HamanoApr 16, 2018

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.