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
loading individual bitmaps as late as possible. This can be
beneficial in repositories that have relatively large bitmap
indexes. Defaults to false.
indexes. Defaults to true.

pack.readReverseIndex::
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;

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

git_config(git_multi_pack_index_write_config, NULL);


View File

@ -250,7 +250,7 @@ static enum {
WRITE_BITMAP_QUIET,
WRITE_BITMAP_TRUE,
} 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_best_effort;

View File

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

View File

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

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


View File

@ -4,37 +4,28 @@ test_description='Tests pack performance using bitmaps'
. ./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_expect_success 'start the test from scratch' '
rm -rf * .git
'

test_perf_large_repo
test_perf_large_repo

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

test_done

View File

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

test_fetch_bitmaps () {
test_expect_success 'setup test directory' '
rm -fr * .git
test_expect_success 'setup test directory' '
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_expect_success 'create bitmapped server repo' '
git config pack.writebitmaps true &&
git config pack.writeBitmapLookupTable '"$1"' &&
git repack -ad
test_perf "server $title" '
git pack-objects --stdout --revs \
--thin --delta-base-offset \
<revs >tmp.pack
'

# 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_size "size $title" '
test_file_size tmp.pack
'

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

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_perf "client $title" '
git index-pack --stdin --fix-thin <tmp.pack
'
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
. "${TEST_DIRECTORY}/perf/lib-bitmap.sh"

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

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

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
# thus by generated bitmaps.
test_expect_success 'create tags' '
git tag --message="tag pointing to HEAD" perf-tag HEAD
'
test_expect_success "start with bitmapped pack" '
git repack -adb
'

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

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

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

test_expect_success "drop pack bitmap (lookup=$enabled)" '
rm -f .git/objects/pack/pack-*.bitmap
'
test_expect_success "create partial bitmap state" '
# 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)" '
# pick a commit to represent the repo tip in the past
cutoff=$(git rev-list HEAD~100 -1) &&
orig_tip=$(git rev-parse HEAD) &&
# and then repack, which will leave us with a nice
# 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 &&

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

# and then repack, which will leave us with a nice
# 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_partial_bitmap

test_done

View File

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