git/t/helper
Taylor Blau 5f5ccd9595 midx: implement `BTMP` chunk
When a multi-pack bitmap is used to implement verbatim pack reuse (that
is, when verbatim chunks from an on-disk packfile are copied
directly[^1]), it does so by using its "preferred pack" as the source
for pack-reuse.

This allows repositories to pack the majority of their objects into a
single (often large) pack, and then use it as the single source for
verbatim pack reuse. This increases the amount of objects that are
reused verbatim (and consequently, decrease the amount of time it takes
to generate many packs). But this performance comes at a cost, which is
that the preferred packfile must pace its growth with that of the entire
repository in order to maintain the utility of verbatim pack reuse.

As repositories grow beyond what we can reasonably store in a single
packfile, the utility of verbatim pack reuse diminishes. Or, at the very
least, it becomes increasingly more expensive to maintain as the pack
grows larger and larger.

It would be beneficial to be able to perform this same optimization over
multiple packs, provided some modest constraints (most importantly, that
the set of packs eligible for verbatim reuse are disjoint with respect
to the subset of their objects being sent).

If we assume that the packs which we treat as candidates for verbatim
reuse are disjoint with respect to any of their objects we may output,
we need to make only modest modifications to the verbatim pack-reuse
code itself. Most notably, we need to remove the assumption that the
bits in the reachability bitmap corresponding to objects from the single
reuse pack begin at the first bit position.

Future patches will unwind these assumptions and reimplement their
existing functionality as special cases of the more general assumptions
(e.g. that reuse bits can start anywhere within the bitset, but happen
to start at 0 for all existing cases).

This patch does not yet relax any of those assumptions. Instead, it
implements a foundational data-structure, the "Bitampped Packs" (`BTMP`)
chunk of the multi-pack index. The `BTMP` chunk's contents are described
in detail here. Importantly, the `BTMP` chunk contains information to
map regions of a multi-pack index's reachability bitmap to the packs
whose objects they represent.

For now, this chunk is only written, not read (outside of the test-tool
used in this patch to test the new chunk's behavior). Future patches
will begin to make use of this new chunk.

[^1]: Modulo patching any `OFS_DELTA`'s that cross over a region of the
  pack that wasn't used verbatim.

Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2023-12-14 14:38:07 -08:00
..
.gitignore
test-advise.c treewide: remove cache.h inclusion due to setup.h changes 2023-03-21 10:56:54 -07:00
test-bitmap.c setup.h: move declarations for setup.c functions from cache.h 2023-03-21 10:56:54 -07:00
test-bloom.c test-bloom: stop setting up Git directory twice 2023-11-07 08:51:40 +09:00
test-bundle-uri.c treewide: remove unnecessary cache.h inclusion from a few headers 2023-03-21 10:56:50 -07:00
test-cache-tree.c cache.h: remove this no-longer-used header 2023-06-21 13:39:53 -07:00
test-chmtime.c t/helper: allow chmtime to print verbosely without modifying mtime 2023-04-14 10:27:52 -07:00
test-config.c config: pass kvi to die_bad_number() 2023-06-28 14:06:40 -07:00
test-crontab.c treewide: remove unnecessary cache.h includes in source files 2023-02-23 17:25:28 -08:00
test-csprng.c
test-ctype.c Merge branch 'rs/test-ctype-eof' 2023-05-10 10:23:27 -07:00
test-date.c Merge branch 'en/header-split-cache-h' 2023-04-25 13:56:20 -07:00
test-delta.c treewide: remove unnecessary includes for wrapper.h 2023-07-05 11:41:59 -07:00
test-dir-iterator.c dir-iterator: drop unused `DIR_ITERATOR_FOLLOW_SYMLINKS` 2023-02-16 16:21:56 -08:00
test-drop-caches.c t/helper: mark unused argv/argc arguments 2023-03-28 14:11:24 -07:00
test-dump-cache-tree.c cache.h: remove this no-longer-used header 2023-06-21 13:39:53 -07:00
test-dump-fsmonitor.c cache.h: remove this no-longer-used header 2023-06-21 13:39:53 -07:00
test-dump-split-index.c t/helper: mark unused callback void data parameters 2023-07-13 17:24:00 -07:00
test-dump-untracked-cache.c cache.h: remove this no-longer-used header 2023-06-21 13:39:53 -07:00
test-env-helper.c parse: separate out parsing functions from config.h 2023-09-29 15:14:57 -07:00
test-example-decorate.c decorate: add clear_decoration() function 2023-10-05 14:54:55 -07:00
test-fake-ssh.c Merge branch 'ab/various-leak-fixes' 2022-12-14 15:55:46 +09:00
test-fast-rebase.c diff.h: remove unnecessary include of oidset.h 2023-06-21 13:39:53 -07:00
test-find-pack.c t/helper: add 'find-pack' test-tool 2023-10-02 14:54:29 -07:00
test-fsmonitor-client.c treewide: remove unnecessary includes for wrapper.h 2023-07-05 11:41:59 -07:00
test-genrandom.c
test-genzeros.c test-genzeros: avoid raw write(2) 2023-02-16 08:30:38 -08:00
test-getcwd.c
test-hash-speed.c cache.h: remove this no-longer-used header 2023-06-21 13:39:53 -07:00
test-hash.c treewide: remove unnecessary cache.h inclusion from several sources 2023-03-21 10:56:51 -07:00
test-hashmap.c t/helper/test-hashmap.c: avoid using `strtok()` 2023-04-24 16:01:28 -07:00
test-hexdump.c t/helper: mark unused argv/argc arguments 2023-03-28 14:11:24 -07:00
test-json-writer.c t/helper/test-json-writer.c: avoid using `strtok()` 2023-04-24 16:01:28 -07:00
test-lazy-init-name-hash.c cache.h: remove this no-longer-used header 2023-06-21 13:39:53 -07:00
test-match-trees.c Merge branch 'en/header-split-cache-h-part-2' 2023-05-09 16:45:46 -07:00
test-mergesort.c treewide: remove cache.h inclusion due to previous changes 2023-04-24 12:47:33 -07:00
test-mktemp.c
test-oid-array.c t/helper: mark unused callback void data parameters 2023-07-13 17:24:00 -07:00
test-oidmap.c Merge branch 'en/header-split-cache-h-part-2' 2023-05-09 16:45:46 -07:00
test-oidtree.c Merge branch 'en/header-split-cache-h-part-2' 2023-05-09 16:45:46 -07:00
test-online-cpus.c t/helper: mark unused argv/argc arguments 2023-03-28 14:11:24 -07:00
test-pack-mtimes.c object-store-ll.h: split this header out of object-store.h 2023-06-21 13:39:54 -07:00
test-parse-options.c parse-options: make CMDMODE errors more precise 2023-10-29 09:15:18 +09:00
test-parse-pathspec-file.c treewide: remove unnecessary inclusion of gettext.h 2023-03-21 10:56:51 -07:00
test-partial-clone.c object-store-ll.h: split this header out of object-store.h 2023-06-21 13:39:54 -07:00
test-path-utils.c cache.h: remove this no-longer-used header 2023-06-21 13:39:53 -07:00
test-pcre2-config.c treewide: remove unnecessary cache.h includes in source files 2023-02-23 17:25:28 -08:00
test-pkt-line.c write-or-die.h: move declarations for write-or-die.c functions from cache.h 2023-03-21 10:56:54 -07:00
test-prio-queue.c t/helper: mark unused argv/argc arguments 2023-03-28 14:11:24 -07:00
test-proc-receive.c treewide: remove cache.h inclusion due to setup.h changes 2023-03-21 10:56:54 -07:00
test-progress.c treewide: remove unnecessary inclusion of gettext.h 2023-03-21 10:56:51 -07:00
test-reach.c Merge branch 'tb/refs-exclusion-and-packed-refs' 2023-07-21 13:47:26 -07:00
test-read-cache.c treewide: remove unnecessary includes for wrapper.h 2023-07-05 11:41:59 -07:00
test-read-graph.c object-store-ll.h: split this header out of object-store.h 2023-06-21 13:39:54 -07:00
test-read-midx.c midx: implement `BTMP` chunk 2023-12-14 14:38:07 -08:00
test-ref-store.c t: allow skipping expected object ID in `ref-store update-ref` 2023-11-03 08:37:06 +09:00
test-reftable.c reftable: ensure git-compat-util.h is the first (indirect) include 2023-04-24 12:47:33 -07:00
test-regex.c
test-repository.c object-store-ll.h: split this header out of object-store.h 2023-06-21 13:39:54 -07:00
test-revision-walking.c diff.h: remove unnecessary include of oidset.h 2023-06-21 13:39:53 -07:00
test-rot13-filter.c
test-run-command.c treewide: remove unnecessary inclusion of gettext.h 2023-03-21 10:56:51 -07:00
test-scrap-cache-tree.c cache.h: remove this no-longer-used header 2023-06-21 13:39:53 -07:00
test-serve-v2.c treewide: remove cache.h inclusion due to setup.h changes 2023-03-21 10:56:54 -07:00
test-sha1.c cache.h: remove this no-longer-used header 2023-06-21 13:39:53 -07:00
test-sha1.sh
test-sha256.c cache.h: remove this no-longer-used header 2023-06-21 13:39:53 -07:00
test-sigchain.c t/helper: mark unused argv/argc arguments 2023-03-28 14:11:24 -07:00
test-simple-ipc.c run-command: mark unused parameters in start_bg_wait callbacks 2023-09-18 15:56:15 -07:00
test-strcmp-offset.c cache.h: remove this no-longer-used header 2023-06-21 13:39:53 -07:00
test-string-list.c Merge branch 'en/header-split-cache-h-part-2' 2023-05-09 16:45:46 -07:00
test-submodule-config.c Merge branch 'en/header-split-cache-h-part-2' 2023-05-09 16:45:46 -07:00
test-submodule-nested-repo-config.c hash-ll.h: split out of hash.h to remove dependency on repository.h 2023-04-24 12:47:32 -07:00
test-submodule.c Merge branch 'en/header-split-cache-h-part-2' 2023-05-09 16:45:46 -07:00
test-subprocess.c treewide: remove cache.h inclusion due to setup.h changes 2023-03-21 10:56:54 -07:00
test-tool-utils.h
test-tool.c Merge branch 'bc/racy-4gb-files' 2023-10-23 13:56:37 -07:00
test-tool.h Merge branch 'bc/racy-4gb-files' 2023-10-23 13:56:37 -07:00
test-trace2.c test-trace2: mark unused argv/argc parameters 2023-08-29 17:56:25 -07:00
test-truncate.c t: add a test helper to truncate files 2023-10-13 13:33:35 -07:00
test-urlmatch-normalization.c
test-userdiff.c config: add ctx arg to config_fn_t 2023-06-28 14:06:39 -07:00
test-wildmatch.c git-compat-util.h: remove unneccessary include of wildmatch.h 2023-06-21 13:39:54 -07:00
test-windows-named-pipe.c
test-write-cache.c cache.h: remove this no-longer-used header 2023-06-21 13:39:53 -07:00
test-xml-encode.c t/helper: mark unused argv/argc arguments 2023-03-28 14:11:24 -07:00