summaryrefslogtreecommitdiffstats
path: root/t/perf/p5551-fetch-rescan.sh
blob: b99dc23e328d1d5d41552295cc4f8450c2e63b79 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/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