Function cargo::sources::git::utils::maybe_gc_repo

source ·
fn maybe_gc_repo(repo: &mut Repository, gctx: &GlobalContext) -> CargoResult<()>
Expand description

Attempts to git gc a repository.

Cargo has a bunch of long-lived git repositories in its global cache and some, like the index, are updated very frequently. Right now each update creates a new “pack file” inside the git database, and over time this can cause bad performance and bad current behavior in libgit2.

One pathological use case today is where libgit2 opens hundreds of file descriptors, getting us dangerously close to blowing out the OS limits of how many fds we can have open. This is detailed in #4403.

To try to combat this problem we attempt a git gc here. Note, though, that we may not even have git installed on the system! As a result we opportunistically try a git gc when the pack directory looks too big, and failing that we just blow away the repository and start over.

In theory this shouldn’t be too expensive compared to the network request we’re about to issue.