pack-objects: default to writing bitmap hash-cache
authorJeff King <peff@peff.net>
Fri, 15 Mar 2019 06:25:28 +0000 (02:25 -0400)
committerJunio C Hamano <gitster@pobox.com>
Mon, 18 Mar 2019 05:11:15 +0000 (14:11 +0900)
Enabling pack.writebitmaphashcache should always be a performance win.
It costs only 4 bytes per object on disk, and the timings in ae4f07fbcc
(pack-bitmap: implement optional name_hash cache, 2013-12-21) show it
improving fetch and partial-bitmap clone times by 40-50%.

The only reason we didn't enable it by default at the time is that early
versions of JGit's bitmap reader complained about the presence of
optional header bits it didn't understand. But that was changed in
JGit's d2fa3987a (Use bitcheck to check for presence of OPT_FULL option,
2013-10-30), which made it into JGit v3.5.0 in late 2014.

So let's turn this option on by default. It's backwards-compatible with
all versions of Git, and if you are also using JGit on the same
repository, you'd only run into problems using a version that's almost 5
years old.

We'll drop the manual setting from all of our test scripts, including
perf tests. This isn't strictly necessary, but it has two advantages:

1. If the hash-cache ever stops being enabled by default, our perf
regression tests will notice.

2. We can use the modified perf tests to show off the behavior of an
otherwise unconfigured repo, as shown below.

These are the results of a few of a perf tests against linux.git that
showed interesting results. You can see the expected speedup in 5310.4,
which was noted in ae4f07fbcc. Curiously, 5310.8 did not improve (and
actually got slower), despite seeing the opposite in ae4f07fbcc.
I don't have an explanation for that.

The tests from p5311 did not exist back then, but do show improvements
(a smaller pack due to better deltas, which we found in less time).

Test HEAD^ HEAD
-------------------------------------------------------------------------------------
5310.4: simulated fetch 7.39(22.70+0.25) 5.64(11.43+0.22) -23.7%
5310.8: clone (partial bitmap) 18.45(24.83+1.19) 19.94(28.40+1.36) +8.1%
5311.31: server (128 days) 0.41(1.13+0.05) 0.34(0.72+0.02) -17.1%
5311.32: size (128 days) 7.4M 7.0M -4.8%
5311.33: client (128 days) 1.33(1.49+0.06) 1.29(1.37+0.12) -3.0%

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/config/pack.txt
builtin/pack-objects.c
t/perf/p5310-pack-bitmaps.sh
t/perf/p5311-pack-bitmaps-fetch.sh
t/t5310-pack-bitmaps.sh
index 425c73aa521a67f87941bd8fc11c69b52432cb00..9cdcfa7324784299f431d94b5237cc136aa585d1 100644 (file)
@@ -124,6 +124,4 @@ pack.writeBitmapHashCache::
        bitmapped and non-bitmapped objects (e.g., when serving a fetch
        between an older, bitmapped pack and objects that have been
        pushed since the last gc). The downside is that it consumes 4
-       bytes per object of disk space, and that JGit's bitmap
-       implementation does not understand it, causing it to complain if
-       Git and JGit are used on the same repository. Defaults to false.
+       bytes per object of disk space. Defaults to true.
index a154fc29f6b7841c2417ca302b631437e7376baa..5264bf055a4f13af1bb435cda8e4b8fac47f3984 100644 (file)
@@ -97,7 +97,7 @@ static off_t reuse_packfile_offset;
 static int use_bitmap_index_default = 1;
 static int use_bitmap_index = -1;
 static int write_bitmap_index;
-static uint16_t write_bitmap_options;
+static uint16_t write_bitmap_options = BITMAP_OPT_HASH_CACHE;
 
 static int exclude_promisor_objects;
 
index bb91dbb173dd01bfbfc11f867f0fcfc355db6822..6a3a42531b056285ac3a42cabe97c41146fa4291 100755 (executable)
@@ -12,8 +12,7 @@ test_perf_large_repo
 # 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 &&
-       git config pack.writebitmaphashcache true
+       git config pack.writebitmaps true
 '
 
 test_perf 'repack to disk' '
index b04575951f51ea1a41229aa7a17643aa0380dbf5..47c3fd7581cc99d562bb5796f3374e207573a304 100755 (executable)
@@ -7,7 +7,6 @@ test_perf_default_repo
 
 test_expect_success 'create bitmapped server repo' '
        git config pack.writebitmaps true &&
-       git config pack.writebitmaphashcache true &&
        git repack -ad
 '
 
index 44a038881af90fa6142db358aa01ea56fae8dcbc..a26c8ba9a2b1b815e1917f703cb3520a7608d624 100755 (executable)
@@ -34,8 +34,7 @@ test_expect_success 'setup repo with moderate-sized history' '
        bitmaptip=$(git rev-parse master) &&
        blob=$(echo tagged-blob | git hash-object -w --stdin) &&
        git tag tagged-blob $blob &&
-       git config repack.writebitmaps true &&
-       git config pack.writebitmaphashcache true
+       git config repack.writebitmaps true
 '
 
 test_expect_success 'full repack creates bitmaps' '