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

[PATCH 0/4] repack: implement `--expire-to` option

From
Taylor Blau <me@ttaylorr.com>
Date
Oct 24, 2022, 18:42 UTC
Message-ID
<cover.1666636974.git.me@ttaylorr.com>

This series polishes off the RFC [1] I sent over the summer teaching `git repack` how to move pruned objects into a separate cruft pack in a different repository.

We've been using this series at GitHub for some time now as an escape-hatch mechanism for quickly recovering pruned objects that run afoul of the "advertise-then-prune" race described in [2].

The general idea is that we write out a second cruft pack to capture the pruned objects, with two minor changes:

  - The second cruft pack counts the first cruft pack as "saved",
    meaning that we'll exclude its objects (thus ignoring both reachable
    and unreachable-but-recent objects from the second cruft pack).
  - The second cruft pack does *not* exclude objects based on age (i.e.,
    it acts as if `--cruft-expiration=never` were given) so as to avoid
    excluding objects which are being pruned due to their age.

The first few patches are preparatory, and the substantive change is implemented in the fourth patch. I would suggest that reviewers start there, and then read the first three patches.

Since this series basically boils down to adding one new conditional, like:

    if (delete_redundant && expire_to) {
        ret = write_cruft_pack(...):
        if (ret)
            return ret;
    }

The (second) call to `write_cruft_pack()` comes with a rather extensive inline comment explaining what is going on ;-).

Thanks in advance for your review.

[1]: https://lore.kernel.org/git/cover.1656528343.git.me@ttaylorr.com/ [2]: https://lore.kernel.org/git/20190319001829.GL29661@sigill.intra.peff.net/

Taylor Blau (4):
  builtin/repack.c: pass "out" to `prepare_pack_objects`
  builtin/repack.c: pass "cruft_expiration" to `write_cruft_pack`
  builtin/repack.c: write cruft packs to arbitrary locations
  builtin/repack.c: implement `--expire-to` for storing pruned objects
 Documentation/git-repack.txt |   6 ++
 builtin/repack.c             |  67 ++++++++++++++++---
 t/t7700-repack.sh            | 121 +++++++++++++++++++++++++++++++++++
 3 files changed, 186 insertions(+), 8 deletions(-)
-- 
2.38.0.16.g393fd4c6db
Next: Taylor Blau
Message 1 of 14 in “repack: implement `--expire-to` option”
  1. 0/4 repack: implement `--expire-to` optionTaylor Blau, Oct 24, 2022
  2. 1/4 builtin/repack.c: pass "out" to `prepare_pack_objects`Taylor Blau, Oct 24, 2022
  3. Junio C HamanoOct 24, 2022
  4. Derrick StoleeNov 7, 2022
  5. 2/4 builtin/repack.c: pass "cruft_expiration" to `write_cruft_pack`Taylor Blau, Oct 24, 2022
  6. Junio C HamanoOct 24, 2022
  7. 4/4 builtin/repack.c: implement `--expire-to` for storing pruned objectsTaylor Blau, Oct 24, 2022
  8. Derrick StoleeNov 7, 2022
  9. Taylor BlauNov 7, 2022
  10. 3/4 builtin/repack.c: write cruft packs to arbitrary locationsTaylor Blau, Oct 24, 2022
  11. Junio C HamanoOct 24, 2022
  12. Taylor BlauOct 28, 2022
  13. Derrick StoleeNov 7, 2022
  14. Taylor BlauNov 7, 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.