# [PATCH] gc --auto: warn gc will soon run, give users a chance to run manually

4 messages from 2011-11-05 to 2011-11-07. Participants: Nguyễn Thái Ngọc Duy, Matthieu Moy, Junio C Hamano, Nguyen Thai Ngoc Duy.
Thread: https://gitlist.dev/t/28847

## Nguyễn Thái Ngọc Duy, 2011-11-05 10:33

Subject: [PATCH] gc --auto: warn gc will soon run, give users a chance to run manually
Message-ID: <1320489212-524-1-git-send-email-pclouds@gmail.com>
URL: https://gitlist.dev/e/1320489212-524-1-git-send-email-pclouds%40gmail.com

```

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 I hate it every single time git hangs because gc is activated.
 Opening another terminal is an option but I would lose all terminal
 settings I have on the current one (e.g. access to suspended vim
 sessions).

 I don't think gc_warn_* need their own config vars. Hopefully
 hardcoded offset is good enough.

 builtin/gc.c |   19 +++++++++++++++++--
 1 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/builtin/gc.c b/builtin/gc.c
index 0498094..1f4555e 100644
--- a/builtin/gc.c
+++ b/builtin/gc.c
@@ -25,7 +25,9 @@ static const char * const builtin_gc_usage[] = {
 static int pack_refs = 1;
 static int aggressive_window = 250;
 static int gc_auto_threshold = 6700;
+static int gc_warn_auto_threshold = 6600;
 static int gc_auto_pack_limit = 50;
+static int gc_warn_auto_pack_limit = 45;
 static const char *prune_expire = "2.weeks.ago";
 
 #define MAX_ADD 10
@@ -50,10 +52,12 @@ static int gc_config(const char *var, const char *value, void *cb)
 	}
 	if (!strcmp(var, "gc.auto")) {
 		gc_auto_threshold = git_config_int(var, value);
+		gc_warn_auto_threshold = gc_auto_threshold - 100;
 		return 0;
 	}
 	if (!strcmp(var, "gc.autopacklimit")) {
 		gc_auto_pack_limit = git_config_int(var, value);
+		gc_warn_auto_pack_limit = gc_auto_pack_limit - 5;
 		return 0;
 	}
 	if (!strcmp(var, "gc.pruneexpire")) {
@@ -118,7 +122,13 @@ static int too_many_loose_objects(void)
 		}
 	}
 	closedir(dir);
-	return needed;
+	if (needed)
+		return 1;
+
+	auto_threshold = (gc_warn_auto_threshold + 255) / 256;
+	if (num_loose > auto_threshold)
+		warning(_("Too many loose objects. \"git gc\" will soon run automatically"));
+	return 0;
 }
 
 static int too_many_packs(void)
@@ -141,7 +151,12 @@ static int too_many_packs(void)
 		 */
 		cnt++;
 	}
-	return gc_auto_pack_limit <= cnt;
+	if (gc_auto_pack_limit <= cnt)
+		return 1;
+
+	if (gc_warn_auto_pack_limit <= cnt)
+		warning(_("Too many packs, \"git gc\" will soon run automatically."));
+	return 0;
 }
 
 static int need_to_gc(void)
-- 
1.7.4.74.g639db

```

## Matthieu Moy, 2011-11-06 16:37

Subject: Re: [PATCH] gc --auto: warn gc will soon run, give users a chance to run manually
Message-ID: <vpqk47dus0e.fsf@bauges.imag.fr>
URL: https://gitlist.dev/e/vpqk47dus0e.fsf%40bauges.imag.fr
In-Reply-To: <1320489212-524-1-git-send-email-pclouds@gmail.com>

```
Nguyễn Thái Ngọc Duy <pclouds@gmail.com> writes:

> +		warning(_("Too many loose objects. \"git gc\" will soon run automatically"));
[...]
> +		warning(_("Too many packs, \"git gc\" will soon run automatically."));

Nit: you have a period in the second message, but not for the first.

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/

```

## Junio C Hamano, 2011-11-07 06:04

Subject: Re: [PATCH] gc --auto: warn gc will soon run, give users a chance to run manually
Message-ID: <7vfwi031ts.fsf@alter.siamese.dyndns.org>
URL: https://gitlist.dev/e/7vfwi031ts.fsf%40alter.siamese.dyndns.org
In-Reply-To: <1320489212-524-1-git-send-email-pclouds@gmail.com>

```
Nguyễn Thái Ngọc Duy  <pclouds@gmail.com> writes:

> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
> ---
>  I hate it every single time git hangs because gc is activated.
>  Opening another terminal is an option but I would lose all terminal
>  settings I have on the current one (e.g. access to suspended vim
>  sessions).
>
>  I don't think gc_warn_* need their own config vars. Hopefully
>  hardcoded offset is good enough.

Let's think about How the user chooses a custom value for the threshold
(or accepts that the default threshold value 6600 is good enough).

In order to minimize the time the user has to endure when the eventual
auto-gc kicks in, the value needs to be small enough, and to minimize the
frequency the auto-gc kicks in, the value needs to be large enough. It is
a balancing act between the two.

Slower users (those who do not create that many objects within a given
time period) can afford to have a small threashold and do not have to
suffer too frequent auto-gc. Busier ones would rather choose larger
threashold to avoid frequent auto-gc because they create many objects
within a given time period.

The reason why the user would want a warning is probably because the user
sometimes is too busy and cannot afford the disruption of auto-gc, but the
busy period luckily does not last indefinitely, e.g. if a warning is given
two days before the auto-gc actually kicks in, then within that two days
there is a window of time that the user can manually run gc while fetching
a cup of coffee. For different users, the "two days" in this example would
be different. Some people would need longer warning period. Some people
can live with shorter warning period. The number of objects before the
next auto-gc run, divided by the number of objects the user would create
on average in an hour, would give the length of the warning period.

Now, I suspect that busier users would need longer window than slower
ones, which leads me to suspect that a good default would not be a
hardcoded constant offset (e.g. once you see the new warning, the auto-gc
kicks in after creating 100 objects) but some ratio of the threshold
(e.g. you have 2% margin after getting a warning before the auto-gc kicks
in).

```

## Nguyen Thai Ngoc Duy, 2011-11-07 10:55

Subject: Re: [PATCH] gc --auto: warn gc will soon run, give users a chance to run manually
Message-ID: <CACsJy8DytH+2WcSpxFYWOR-chgorumzDawYyY1S+MKKDzRa6zw@mail.gmail.com>
URL: https://gitlist.dev/e/CACsJy8DytH%2B2WcSpxFYWOR-chgorumzDawYyY1S%2BMKKDzRa6zw%40mail.gmail.com
In-Reply-To: <7vfwi031ts.fsf@alter.siamese.dyndns.org>

```
2011/11/7 Junio C Hamano <gitster@pobox.com>:
> Nguyễn Thái Ngọc Duy  <pclouds@gmail.com> writes:
>
>> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
>> ---
>>  I hate it every single time git hangs because gc is activated.
>>  Opening another terminal is an option but I would lose all terminal
>>  settings I have on the current one (e.g. access to suspended vim
>>  sessions).
>>
>>  I don't think gc_warn_* need their own config vars. Hopefully
>>  hardcoded offset is good enough.
>
> Let's think about How the user chooses a custom value for the threshold
> (or accepts that the default threshold value 6600 is good enough).
>
> ...
>
> Now, I suspect that busier users would need longer window than slower
> ones, which leads me to suspect that a good default would not be a
> hardcoded constant offset (e.g. once you see the new warning, the auto-gc
> kicks in after creating 100 objects) but some ratio of the threshold
> (e.g. you have 2% margin after getting a warning before the auto-gc kicks
> in).

Speaking for myself, as soon as I see the warning, I would immediately
start a new shell for git-gc alone and get back to my work (hopefully
gc will not be activated again while another gc is running) so one or
maybe three warnings may be enough. But yes, some ratio may be better
for different users.
-- 
Duy

```
