Merge branch 'tb/pack-bitmap-lookup-tables' into jch

Enable lookup tables extension in pack bitmap (and midx bitmap) by
default.

Comments?

* tb/pack-bitmap-lookup-tables:
  t/perf/lib-bitmap.sh: avoid test_perf during setup
  t/perf: avoid testing bitmaps without lookup table
  p5312: removed duplicate performance test script
  pack-bitmap: write lookup table extension by default
Junio C Hamano 2025-05-01 14:07:19 -07:00
commit 37847942c5
10 changed files with 96 additions and 157 deletions

View File

@ -199,7 +199,7 @@ pack.writeBitmapLookupTable::
bitmap index (if one is written). This table is used to defer bitmap index (if one is written). This table is used to defer
loading individual bitmaps as late as possible. This can be loading individual bitmaps as late as possible. This can be
beneficial in repositories that have relatively large bitmap beneficial in repositories that have relatively large bitmap
indexes. Defaults to false. indexes. Defaults to true.


pack.readReverseIndex:: pack.readReverseIndex::
When true, git will read any .rev file(s) that may be available When true, git will read any .rev file(s) that may be available

View File

@ -142,6 +142,7 @@ static int cmd_multi_pack_index_write(int argc, const char **argv,
int ret; int ret;


opts.flags |= MIDX_WRITE_BITMAP_HASH_CACHE; opts.flags |= MIDX_WRITE_BITMAP_HASH_CACHE;
opts.flags |= MIDX_WRITE_BITMAP_LOOKUP_TABLE;


git_config(git_multi_pack_index_write_config, NULL); git_config(git_multi_pack_index_write_config, NULL);



View File

@ -250,7 +250,7 @@ static enum {
WRITE_BITMAP_QUIET, WRITE_BITMAP_QUIET,
WRITE_BITMAP_TRUE, WRITE_BITMAP_TRUE,
} write_bitmap_index; } write_bitmap_index;
static uint16_t write_bitmap_options = BITMAP_OPT_HASH_CACHE; static uint16_t write_bitmap_options = BITMAP_OPT_HASH_CACHE | BITMAP_OPT_LOOKUP_TABLE;


static int exclude_promisor_objects; static int exclude_promisor_objects;
static int exclude_promisor_objects_best_effort; static int exclude_promisor_objects_best_effort;

View File

@ -1131,7 +1131,6 @@ benchmarks = [
'perf/p5304-prune.sh', 'perf/p5304-prune.sh',
'perf/p5310-pack-bitmaps.sh', 'perf/p5310-pack-bitmaps.sh',
'perf/p5311-pack-bitmaps-fetch.sh', 'perf/p5311-pack-bitmaps-fetch.sh',
'perf/p5312-pack-bitmaps-revs.sh',
'perf/p5313-pack-objects.sh', 'perf/p5313-pack-objects.sh',
'perf/p5314-name-hash.sh', 'perf/p5314-name-hash.sh',
'perf/p5326-multi-pack-bitmaps.sh', 'perf/p5326-multi-pack-bitmaps.sh',

View File

@ -69,7 +69,7 @@ test_partial_bitmap () {
} }


test_pack_bitmap () { test_pack_bitmap () {
test_perf "repack to disk" ' test_expect_success "repack to disk" '
git repack -ad git repack -ad
' '



View File

@ -4,37 +4,28 @@ test_description='Tests pack performance using bitmaps'
. ./perf-lib.sh . ./perf-lib.sh
. "${TEST_DIRECTORY}/perf/lib-bitmap.sh" . "${TEST_DIRECTORY}/perf/lib-bitmap.sh"


test_lookup_pack_bitmap () { test_expect_success 'start the test from scratch' '
test_expect_success 'start the test from scratch' ' rm -rf * .git
rm -rf * .git '
'


test_perf_large_repo test_perf_large_repo


# note that we do everything through config, # note that we do everything through config,
# since we want to be able to compare bitmap-aware # since we want to be able to compare bitmap-aware
# git versus non-bitmap git # git versus non-bitmap git
# #
# We intentionally use the deprecated pack.writebitmaps # We intentionally use the deprecated pack.writebitmaps
# config so that we can test against older versions of git. # config so that we can test against older versions of git.
test_expect_success 'setup bitmap config' ' test_expect_success 'setup bitmap config' '
git config pack.writebitmaps true git config pack.writebitmaps true
' '


# we need to create the tag up front such that it is covered by the repack and # we need to create the tag up front such that it is covered by the repack and
# thus by generated bitmaps. # thus by generated bitmaps.
test_expect_success 'create tags' ' test_expect_success 'create tags' '
git tag --message="tag pointing to HEAD" perf-tag HEAD git tag --message="tag pointing to HEAD" perf-tag HEAD
' '


test_perf "enable lookup table: $1" ' test_pack_bitmap
git config pack.writeBitmapLookupTable '"$1"'
'

test_pack_bitmap
}

test_lookup_pack_bitmap false
test_lookup_pack_bitmap true


test_done test_done

View File

@ -3,52 +3,46 @@
test_description='performance of fetches from bitmapped packs' test_description='performance of fetches from bitmapped packs'
. ./perf-lib.sh . ./perf-lib.sh


test_fetch_bitmaps () { test_expect_success 'setup test directory' '
test_expect_success 'setup test directory' ' rm -fr * .git
rm -fr * .git '

test_perf_default_repo

test_expect_success 'create bitmapped server repo' '
git config pack.writebitmaps true &&
git repack -ad
'

# simulate a fetch from a repository that last fetched N days ago, for
# various values of N. We do so by following the first-parent chain,
# and assume the first entry in the chain that is N days older than the current
# HEAD is where the HEAD would have been then.
for days in 1 2 4 8 16 32 64 128; do
title=$(printf '%10s' "($days days)")
test_expect_success "setup revs from $days days ago" '
now=$(git log -1 --format=%ct HEAD) &&
then=$(($now - ($days * 86400))) &&
tip=$(git rev-list -1 --first-parent --until=$then HEAD) &&
{
echo HEAD &&
echo ^$tip
} >revs
' '


test_perf_default_repo test_perf "server $title" '

git pack-objects --stdout --revs \
test_expect_success 'create bitmapped server repo' ' --thin --delta-base-offset \
git config pack.writebitmaps true && <revs >tmp.pack
git config pack.writeBitmapLookupTable '"$1"' &&
git repack -ad
' '


# simulate a fetch from a repository that last fetched N days ago, for test_size "size $title" '
# various values of N. We do so by following the first-parent chain, test_file_size tmp.pack
# and assume the first entry in the chain that is N days older than the current '
# HEAD is where the HEAD would have been then.
for days in 1 2 4 8 16 32 64 128; do
title=$(printf '%10s' "($days days)")
test_expect_success "setup revs from $days days ago" '
now=$(git log -1 --format=%ct HEAD) &&
then=$(($now - ($days * 86400))) &&
tip=$(git rev-list -1 --first-parent --until=$then HEAD) &&
{
echo HEAD &&
echo ^$tip
} >revs
'


test_perf "server $title (lookup=$1)" ' test_perf "client $title" '
git pack-objects --stdout --revs \ git index-pack --stdin --fix-thin <tmp.pack
--thin --delta-base-offset \ '
<revs >tmp.pack done
'

test_size "size $title" '
test_file_size tmp.pack
'

test_perf "client $title (lookup=$1)" '
git index-pack --stdin --fix-thin <tmp.pack
'
done
}

test_fetch_bitmaps true
test_fetch_bitmaps false


test_done test_done

View File

@ -1,34 +0,0 @@
#!/bin/sh

test_description='Tests pack performance using bitmaps (rev index enabled)'
. ./perf-lib.sh
. "${TEST_DIRECTORY}/perf/lib-bitmap.sh"

test_lookup_pack_bitmap () {
test_expect_success 'start the test from scratch' '
rm -rf * .git
'

test_perf_large_repo

test_expect_success 'setup bitmap config' '
git config pack.writebitmaps true
'

# we need to create the tag up front such that it is covered by the repack and
# thus by generated bitmaps.
test_expect_success 'create tags' '
git tag --message="tag pointing to HEAD" perf-tag HEAD
'

test_perf "enable lookup table: $1" '
git config pack.writeBitmapLookupTable '"$1"'
'

test_pack_bitmap
}

test_lookup_pack_bitmap false
test_lookup_pack_bitmap true

test_done

View File

@ -4,64 +4,53 @@ test_description='Tests performance using midx bitmaps'
. ./perf-lib.sh . ./perf-lib.sh
. "${TEST_DIRECTORY}/perf/lib-bitmap.sh" . "${TEST_DIRECTORY}/perf/lib-bitmap.sh"


test_bitmap () { test_expect_success "remove existing repo" '
local enabled="$1" rm -fr * .git
'


test_expect_success "remove existing repo (lookup=$enabled)" ' test_perf_large_repo
rm -fr * .git
'


test_perf_large_repo # we need to create the tag up front such that it is covered by the repack and
# thus by generated bitmaps.
test_expect_success 'create tags' '
git tag --message="tag pointing to HEAD" perf-tag HEAD
'


# we need to create the tag up front such that it is covered by the repack and test_expect_success "start with bitmapped pack" '
# thus by generated bitmaps. git repack -adb
test_expect_success 'create tags' ' '
git tag --message="tag pointing to HEAD" perf-tag HEAD
'


test_expect_success "use lookup table: $enabled" ' test_perf "setup multi-pack index" '
git config pack.writeBitmapLookupTable '"$enabled"' git multi-pack-index write --bitmap
' '


test_expect_success "start with bitmapped pack (lookup=$enabled)" ' test_expect_success "drop pack bitmap" '
git repack -adb rm -f .git/objects/pack/pack-*.bitmap
' '


test_perf "setup multi-pack index (lookup=$enabled)" ' test_full_bitmap
git multi-pack-index write --bitmap
'


test_expect_success "drop pack bitmap (lookup=$enabled)" ' test_expect_success "create partial bitmap state" '
rm -f .git/objects/pack/pack-*.bitmap # pick a commit to represent the repo tip in the past
' cutoff=$(git rev-list HEAD~100 -1) &&
orig_tip=$(git rev-parse HEAD) &&


test_full_bitmap # now pretend we have just one tip
rm -rf .git/logs .git/refs/* .git/packed-refs &&
git update-ref HEAD $cutoff &&


test_expect_success "create partial bitmap state (lookup=$enabled)" ' # and then repack, which will leave us with a nice
# pick a commit to represent the repo tip in the past # big bitmap pack of the "old" history, and all of
cutoff=$(git rev-list HEAD~100 -1) && # the new history will be loose, as if it had been pushed
orig_tip=$(git rev-parse HEAD) && # up incrementally and exploded via unpack-objects
git repack -Ad &&
git multi-pack-index write --bitmap &&


# now pretend we have just one tip # and now restore our original tip, as if the pushes
rm -rf .git/logs .git/refs/* .git/packed-refs && # had happened
git update-ref HEAD $cutoff && git update-ref HEAD $orig_tip
'


# and then repack, which will leave us with a nice test_partial_bitmap
# big bitmap pack of the "old" history, and all of
# the new history will be loose, as if it had been pushed
# up incrementally and exploded via unpack-objects
git repack -Ad &&
git multi-pack-index write --bitmap &&

# and now restore our original tip, as if the pushes
# had happened
git update-ref HEAD $orig_tip
'

test_partial_bitmap
}

test_bitmap false
test_bitmap true


test_done test_done

View File

@ -11,7 +11,6 @@ test_expect_success 'setup' '
-c bitmapPseudoMerge.all.threshold=now \ -c bitmapPseudoMerge.all.threshold=now \
-c bitmapPseudoMerge.all.stableThreshold=never \ -c bitmapPseudoMerge.all.stableThreshold=never \
-c bitmapPseudoMerge.all.maxMerges=64 \ -c bitmapPseudoMerge.all.maxMerges=64 \
-c pack.writeBitmapLookupTable=true \
repack -adb repack -adb
' '