2013-12-21 15:00:42 +01:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
test_description='Tests pack performance using bitmaps'
|
|
|
|
. ./perf-lib.sh
|
|
|
|
|
|
|
|
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
|
2014-06-10 22:20:30 +02:00
|
|
|
#
|
|
|
|
# We intentionally use the deprecated pack.writebitmaps
|
|
|
|
# config so that we can test against older versions of git.
|
2013-12-21 15:00:42 +01:00
|
|
|
test_expect_success 'setup bitmap config' '
|
pack-bitmap: implement optional name_hash cache
When we use pack bitmaps rather than walking the object
graph, we end up with the list of objects to include in the
packfile, but we do not know the path at which any tree or
blob objects would be found.
In a recently packed repository, this is fine. A fetch would
use the paths only as a heuristic in the delta compression
phase, and a fully packed repository should not need to do
much delta compression.
As time passes, though, we may acquire more objects on top
of our large bitmapped pack. If clients fetch frequently,
then they never even look at the bitmapped history, and all
works as usual. However, a client who has not fetched since
the last bitmap repack will have "have" tips in the
bitmapped history, but "want" newer objects.
The bitmaps themselves degrade gracefully in this
circumstance. We manually walk the more recent bits of
history, and then use bitmaps when we hit them.
But we would also like to perform delta compression between
the newer objects and the bitmapped objects (both to delta
against what we know the user already has, but also between
"new" and "old" objects that the user is fetching). The lack
of pathnames makes our delta heuristics much less effective.
This patch adds an optional cache of the 32-bit name_hash
values to the end of the bitmap file. If present, a reader
can use it to match bitmapped and non-bitmapped names during
delta compression.
Here are perf results for p5310:
Test origin/master HEAD^ HEAD
-------------------------------------------------------------------------------------------------
5310.2: repack to disk 36.81(37.82+1.43) 47.70(48.74+1.41) +29.6% 47.75(48.70+1.51) +29.7%
5310.3: simulated clone 30.78(29.70+2.14) 1.08(0.97+0.10) -96.5% 1.07(0.94+0.12) -96.5%
5310.4: simulated fetch 3.16(6.10+0.08) 3.54(10.65+0.06) +12.0% 1.70(3.07+0.06) -46.2%
5310.6: partial bitmap 36.76(43.19+1.81) 6.71(11.25+0.76) -81.7% 4.08(6.26+0.46) -88.9%
You can see that the time spent on an incremental fetch goes
down, as our delta heuristics are able to do their work.
And we save time on the partial bitmap clone for the same
reason.
Signed-off-by: Vicent Marti <tanoku@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2013-12-21 15:00:45 +01:00
|
|
|
git config pack.writebitmaps true &&
|
|
|
|
git config pack.writebitmaphashcache true
|
2013-12-21 15:00:42 +01:00
|
|
|
'
|
|
|
|
|
|
|
|
test_perf 'repack to disk' '
|
|
|
|
git repack -ad
|
|
|
|
'
|
|
|
|
|
|
|
|
test_perf 'simulated clone' '
|
|
|
|
git pack-objects --stdout --all </dev/null >/dev/null
|
|
|
|
'
|
|
|
|
|
|
|
|
test_perf 'simulated fetch' '
|
|
|
|
have=$(git rev-list HEAD~100 -1) &&
|
|
|
|
{
|
|
|
|
echo HEAD &&
|
|
|
|
echo ^$have
|
|
|
|
} | git pack-objects --revs --stdout >/dev/null
|
|
|
|
'
|
|
|
|
|
|
|
|
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) &&
|
|
|
|
|
|
|
|
# now kill off all of the refs and pretend we had
|
|
|
|
# just the one tip
|
|
|
|
rm -rf .git/logs .git/refs/* .git/packed-refs
|
|
|
|
git update-ref HEAD $cutoff
|
|
|
|
|
|
|
|
# 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
|
|
|
|
|
|
|
|
# and now restore our original tip, as if the pushes
|
|
|
|
# had happened
|
|
|
|
git update-ref HEAD $orig_tip
|
|
|
|
'
|
|
|
|
|
|
|
|
test_perf 'partial bitmap' '
|
|
|
|
git pack-objects --stdout --all </dev/null >/dev/null
|
|
|
|
'
|
|
|
|
|
|
|
|
test_done
|