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

[PATCH 0/4] Speed up repacking when lots of pack-kept objects

From
NFNathaniel Filardo <nwf20@cl.cam.ac.uk>
Date
Mar 12, 2019, 13:18 UTC
Message-ID
<20190312131858.26115-1-nwf20@cl.cam.ac.uk>

This patch series improves handling of very large repositories, as generated by, for example, bup (https://github.com/bup/bup). Prolonged operation thereof creates quite a lot of small pack files; repacking improves filesystem performance of the objects/pack directory, but is quite expensive, in terms of time and memory. We have adopted a strategy that marks "large" (tens of GB) of pack files as "kept" and defers repacking until there are enough un-kept packs or enough bytes of un-kept objects. (The first patch in the series will make our accounting easier, replacing some terrible shell scripting with grep.)

While this strategy has generally improved our lives relative to either extreme (not repacking, or repacking after every bup save operation), it still leaves a good bit to be desired. Because our packs are marked as kept, repacking will leave the objects therein alone, but it still must instantiate in memory and walk the entire object graph. However, because our kept packs are transitively closed, such that an object in one necessarily references only objects in other kept packs, we should like to avoid reasoning about them more or less altogether.

This series attempts to do just that. The middle patches are just some groundwork for the last patch, which carries the punch line. This last patch adds an option to builtin/repack to enumerate commit and tree objects within kept packs as UNINTERESTING to its spawned builtin/pack-objects command. Together with inducing the use of sparse reachability, this speeds enumerating candidate objects for repacking and thereby substantially reduces the runtime of our repack operations, while producing identical results.

I am, however, rather a novice when it comes to git internals, so any and all feedback is quite welcome.

Nathaniel Filardo (4):
  count-objects: report statistics about kept packs
  revision walk: optionally use sparse reachability
  repack: add --sparse and pass to pack-objects
  repack: optionally assume transitive kept packs
 Documentation/git-gc.txt         |  5 +++
 Documentation/git-repack.txt     | 25 +++++++++++++
 bisect.c                         |  2 +-
 blame.c                          |  2 +-
 builtin/checkout.c               |  2 +-
 builtin/commit.c                 |  2 +-
 builtin/count-objects.c          | 17 ++++++++-
 builtin/describe.c               |  2 +-
 builtin/fast-export.c            |  2 +-
 builtin/fmt-merge-msg.c          |  2 +-
 builtin/gc.c                     |  5 +++
 builtin/log.c                    | 10 ++---
 builtin/merge.c                  |  2 +-
 builtin/pack-objects.c           |  4 +-
 builtin/repack.c                 | 64 +++++++++++++++++++++++++++++++-
 builtin/rev-list.c               |  2 +-
 builtin/shortlog.c               |  2 +-
 bundle.c                         |  2 +-
 http-push.c                      |  2 +-
 merge-recursive.c                |  2 +-
 pack-bitmap-write.c              |  2 +-
 pack-bitmap.c                    |  4 +-
 reachable.c                      |  4 +-
 ref-filter.c                     |  2 +-
 remote.c                         |  2 +-
 revision.c                       | 10 +++--
 revision.h                       |  2 +-
 sequencer.c                      |  6 +--
 shallow.c                        |  2 +-
 submodule.c                      |  4 +-
 t/helper/test-revision-walking.c |  2 +-
 31 files changed, 154 insertions(+), 42 deletions(-)
-- 
2.17.1
Next: Nathaniel Filardo
Message 1 of 8 in “Speed up repacking when lots of pack-kept objects”
  1. 0/4 Speed up repacking when lots of pack-kept objectsNathaniel Filardo, Mar 12, 2019
  2. 3/4 repack: add --sparse and pass to pack-objectsNathaniel Filardo, Mar 12, 2019
  3. Derrick StoleeMar 12, 2019
  4. Dr N.W. FilardoMar 12, 2019
  5. 1/4 count-objects: report statistics about kept packsNathaniel Filardo, Mar 12, 2019
  6. 4/4 repack: optionally assume transitive kept packsNathaniel Filardo, Mar 12, 2019
  7. 2/4 revision walk: optionally use sparse reachabilityNathaniel Filardo, Mar 12, 2019
  8. Derrick StoleeMar 12, 2019

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.