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

Re: [PATCH 0/7] midx: ignore cruft pack with `repack`, `expire`

From
Derrick Stolee <derrickstolee@github.com>
Date
Sep 22, 2022, 14:14 UTC
Message-ID
<63a1c3d4-eff3-af10-4263-058c88e74594@github.com>
In-Reply-To
<cover.1663638929.git.me@ttaylorr.com>
On 9/19/2022 9:55 PM, Taylor Blau wrote:
Show 14 quoted lines
> This series fixes a pair of bugs that were originally pointed out by
> Gregory Szorc in [1].
> 
> Namely, that both `git multi-pack-index repack` and `git
> multi-pack-index expire` can cause us to "absorb" the cruft pack,
> distributing its objects into a new pack, and removing its metadata.
> 
> This is worth avoiding, since even though it doesn't result in object
> corruption, this bug removes semi-important metadata contained in the
> .mtimes file, which controls how fast objects leave the repository
> during a pruning GC.
> 
> This series teaches both sub-commands to avoid any cruft pack(s),
> preserving their metadata.

I gave these patches a careful review. They all look correct and are closing possible gaps in this mixed mode of repacking with different strategies.

I do think the 'expire' situation is very rare, but it's best to be safe here.

Overall, the end result is that users could set up their background maintenance as follows:

 1. maintenance.incremental-repack.schedule=daily to do an
    incremental repack every night.
 2. maintenance.gc.schedule=weekly to do a GC once a week.
 3. With gc.cruftPacks=true and a gc.pruneExpire value, the cruft
    packs will be written on that weekly job, only expiring old
    enough objects.

Before this series, that weekly GC creating cruft packs ran the (very likely) risk of those cruft packs being rewritten with the rest of the new object data, losing the .mtimes data.

(While the proposed schedule above is now possible, I don't recommend it as a default. Not only will it delete objects automatically, but the GC task is very expensive for very large repositories and the incremental-repack task was explicitly created to avoid that huge cost in those cases.)

Thanks for this update! -Stolee

Previous: Christian Couder
Message 11 of 11 in “midx: ignore cruft pack with `repack`, `expire`”
  1. 0/7 midx: ignore cruft pack with `repack`, `expire`Taylor Blau, Sep 20, 2022
  2. 1/7 Documentation/git-multi-pack-index.txt: fix typoTaylor Blau, Sep 20, 2022
  3. 2/7 Documentation/git-multi-pack-index.txt: clarify expire behaviorTaylor Blau, Sep 20, 2022
  4. 3/7 midx.c: prevent `expire` from removing the cruft packTaylor Blau, Sep 20, 2022
  5. Derrick StoleeSep 22, 2022
  6. 4/7 midx.c: avoid cruft packs with `repack --batch-size=0`Taylor Blau, Sep 20, 2022
  7. 5/7 midx.c: replace `xcalloc()` with `CALLOC_ARRAY()`Taylor Blau, Sep 20, 2022
  8. 6/7 midx.c: remove unnecessary loop conditionTaylor Blau, Sep 20, 2022
  9. 7/7 midx.c: avoid cruft packs with non-zero `repack --batch-size`Taylor Blau, Sep 20, 2022
  10. Christian CouderSep 20, 2022
  11. Derrick StoleeSep 22, 2022

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.