Re: [PATCH] gc: do not warn about too many loose objects
- From
Jeff King <peff@peff.net>
- Date
- Jul 16, 2018, 17:51 UTC
- Message-ID
- <20180716175103.GB18636@sigill.intra.peff.net>
- In-Reply-To
- <20180716172717.237373-1-jonathantanmy@google.com>
On Mon, Jul 16, 2018 at 10:27:17AM -0700, Jonathan Tan wrote:
Show 12 quoted lines
> In a087cc9819 ("git-gc --auto: protect ourselves from accumulated
> cruft", 2007-09-17), the user was warned if there were too many
> unreachable loose objects. This made sense at the time, because gc
> couldn't prune them safely. But subsequently, git prune learned the
> ability to not prune recently created loose objects, making pruning able
> to be done more safely, and gc was made to automatically prune old
> unreachable loose objects in 25ee9731c1 ("gc: call "prune --expire
> 2.weeks.ago" by default", 2008-03-12).
>
> This makes the warning unactionable by the user, as any loose objects
> left are not deleted yet because of safety, and "git prune" is not a
> command that the user is recommended to run directly anyway.I'm not sure if this tells the whole story. You may still run into a case where auto-gc runs over and over during the grace period, because you have a bunch of objects which are not reachable and not yet ready to be expired. So a gc cannot make forward progress until the 2-week expiration, and the way to break the cycle is to run an immediate "prune".
So while I completely agree that it's not a great thing to encourage users to blindly run "git prune", I think it _is_ actionable.
But...
> This was noticed when a daemonized gc run wrote this warning to the log > file, and returned 0; but a subsequent run merely read the log file, saw > that it is non-empty and returned -1 (which is inconsistent in that such > a run should return 0, as it did the first time).
Yes, this got much worse with daemonized gc. The warning blocks further runs. And then even after the 2-week period, you still cannot make further progress until the user steps in! I think we dealt with that in a831c06a2b (gc: ignore old gc.log files, 2017-02-10). So now we won't run gc for a day, but eventually we may make further progress.
So the warning _is_ still doing something useful there (it's blocking immediate auto-gc and kicking in the 1-day threshold).
I agree that the "-1" return is a little funny. Perhaps on the reading side we should detect that the log contains only a "warning" line and adjust our exit code accordingly.
Ultimately, I think Git should avoid keeping unreachable objects as loose in the first place, which would make this whole problem go away. There's some discussion in this thread:
https://public-inbox.org/git/87inc89j38.fsf@evledraar.gmail.com/
-Peff