git/t/perf/p5551-fetch-rescan.sh

56 lines
1.4 KiB
Bash
Executable File

#!/bin/sh
test_description='fetch performance with many packs
It is common for fetch to consider objects that we might not have, and it is an
easy mistake for the code to use a function like `parse_object` that might
give the correct _answer_ on such an object, but do so slowly (due to
re-scanning the pack directory for lookup failures).
The resulting performance drop can be hard to notice in a real repository, but
becomes quite large in a repository with a large number of packs. So this
test creates a more pathological case, since any mistakes would produce a more
noticeable slowdown.
'
. ./perf-lib.sh
. "$TEST_DIRECTORY"/perf/lib-pack.sh
test_expect_success 'create parent and child' '
git init parent &&
git clone parent child
'
test_expect_success 'create refs in the parent' '
(
cd parent &&
git commit --allow-empty -m foo &&
head=$(git rev-parse HEAD) &&
test_seq 1000 |
sed "s,.*,update refs/heads/& $head," |
$MODERN_GIT update-ref --stdin
)
'
test_expect_success 'create many packs in the child' '
(
cd child &&
setup_many_packs
)
'
test_perf 'fetch' '
# start at the same state for each iteration
obj=$($MODERN_GIT -C parent rev-parse HEAD) &&
(
cd child &&
$MODERN_GIT for-each-ref --format="delete %(refname)" refs/remotes |
$MODERN_GIT update-ref --stdin &&
rm -vf .git/objects/$(echo $obj | sed "s|^..|&/|") &&
git fetch
)
'
test_done