| 1 | #!/bin/sh |
| 2 | |
| 3 | test_description='fetch performance with many packs |
| 4 | |
| 5 | It is common for fetch to consider objects that we might not have, and it is an |
| 6 | easy mistake for the code to use a function like `parse_object` that might |
| 7 | give the correct _answer_ on such an object, but do so slowly (due to |
| 8 | re-scanning the pack directory for lookup failures). |
| 9 | |
| 10 | The resulting performance drop can be hard to notice in a real repository, but |
| 11 | becomes quite large in a repository with a large number of packs. So this |
| 12 | test creates a more pathological case, since any mistakes would produce a more |
| 13 | noticeable slowdown. |
| 14 | ' |
| 15 | . ./perf-lib.sh |
| 16 | . "$TEST_DIRECTORY"/perf/lib-pack.sh |
| 17 | |
| 18 | test_expect_success 'create parent and child' ' |
| 19 | git init parent && |
| 20 | git clone parent child |
| 21 | ' |
| 22 | |
| 23 | |
| 24 | test_expect_success 'create refs in the parent' ' |
| 25 | ( |
| 26 | cd parent && |
| 27 | git commit --allow-empty -m foo && |
| 28 | head=$(git rev-parse HEAD) && |
| 29 | test_seq 1000 | |
| 30 | sed "s,.*,update refs/heads/& $head," | |
| 31 | $MODERN_GIT update-ref --stdin |
| 32 | ) |
| 33 | ' |
| 34 | |
| 35 | test_expect_success 'create many packs in the child' ' |
| 36 | ( |
| 37 | cd child && |
| 38 | setup_many_packs |
| 39 | ) |
| 40 | ' |
| 41 | |
| 42 | test_perf 'fetch' ' |
| 43 | # start at the same state for each iteration |
| 44 | obj=$($MODERN_GIT -C parent rev-parse HEAD) && |
| 45 | ( |
| 46 | cd child && |
| 47 | $MODERN_GIT for-each-ref --format="delete %(refname)" refs/remotes | |
| 48 | $MODERN_GIT update-ref --stdin && |
| 49 | rm -vf .git/objects/$(echo $obj | sed "s|^..|&/|") && |
| 50 | |
| 51 | git fetch |
| 52 | ) |
| 53 | ' |
| 54 | |
| 55 | test_done |