diff tests/test-sparse-revlog.t @ 39491:4ca7a67c94c8

sparse-revlog: add a test checking revlog deltas for a churning file The test repository contains 5000 revisions and is therefore slow to build: five minutes with CHG, over fifteen minutes without. It is too slow to build during the test. Bundling all content produce a sizeable result, 20BM, too large to be committed. Instead, we commit a script to build the expected bundle and the test checks if the bundle is available. Any run of the script will produce the same repository content, using resulting in the same hashes. Using smaller repositories was tried, however, it misses most of the cases we are planning to improve. Having them in a 5000 repository is already nice, we usually see these case in repositories in the order of magnitude of one million revisions. This test will be very useful to check various changes strategy for building delta to store in a sparse-revlog. In this series we will focus our attention on the following metrics: The ones that will impact the final storage performance (size, space): * size of the revlog data file (".hg/store/data/*.d") * chain length info The ones that describe the deltas patterns: * number of snapshot revision (and their level) * size taken by snapshot revision (and their level)
author Boris Feld <boris.feld@octobus.net>
date Mon, 10 Sep 2018 09:08:24 -0700
parents
children a33f394b2bfd
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-sparse-revlog.t	Mon Sep 10 09:08:24 2018 -0700
@@ -0,0 +1,121 @@
+====================================
+Test delta choice with sparse revlog
+====================================
+
+Sparse-revlog usually shows the most gain on Manifest. However, it is simpler
+to general an appropriate file, so we test with a single file instead. The
+goal is to observe intermediate snapshot being created.
+
+We need a large enough file. Part of the content needs to be replaced
+repeatedly while some of it changes rarely.
+
+  $ bundlepath="$TESTDIR/artifacts/cache/big-file-churn.hg"
+
+  $ expectedhash=`cat "$bundlepath".md5`
+  $ if [ ! -f "$bundlepath" ]; then
+  >     echo 'skipped: missing artifact, run "'"$TESTDIR"'/artifacts/scripts/generate-churning-bundle.py"'
+  >     exit 80
+  > fi
+  $ currenthash=`f -M "$bundlepath" | cut -d = -f 2`
+  $ if [ "$currenthash" != "$expectedhash" ]; then
+  >     echo 'skipped: outdated artifact, md5 "'"$currenthash"'" expected "'"$expectedhash"'" run "'"$TESTDIR"'/artifacts/scripts/generate-churning-bundle.py"'
+  >     exit 80
+  > fi
+
+  $ cat >> $HGRCPATH << EOF
+  > [format]
+  > sparse-revlog = yes
+  > [storage]
+  > revlog.optimize-delta-parent-choice = yes
+  > EOF
+  $ hg init sparse-repo
+  $ cd sparse-repo
+  $ hg unbundle $bundlepath
+  adding changesets
+  adding manifests
+  adding file changes
+  added 5001 changesets with 5001 changes to 1 files (+89 heads)
+  new changesets 9706f5af64f4:d9032adc8114 (5001 drafts)
+  (run 'hg heads' to see heads, 'hg merge' to merge)
+  $ hg up
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  updated to "d9032adc8114: commit #5000"
+  89 other heads for branch "default"
+
+  $ hg log --stat -r 0:3
+  changeset:   0:9706f5af64f4
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     initial commit
+  
+   SPARSE-REVLOG-TEST-FILE |  10500 ++++++++++++++++++++++++++++++++++++++++++++++
+   1 files changed, 10500 insertions(+), 0 deletions(-)
+  
+  changeset:   1:724907deaa5e
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     commit #1
+  
+   SPARSE-REVLOG-TEST-FILE |  1068 +++++++++++++++++++++++-----------------------
+   1 files changed, 534 insertions(+), 534 deletions(-)
+  
+  changeset:   2:62c41bce3e5d
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     commit #2
+  
+   SPARSE-REVLOG-TEST-FILE |  1068 +++++++++++++++++++++++-----------------------
+   1 files changed, 534 insertions(+), 534 deletions(-)
+  
+  changeset:   3:348a9cbd6959
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     commit #3
+  
+   SPARSE-REVLOG-TEST-FILE |  1068 +++++++++++++++++++++++-----------------------
+   1 files changed, 534 insertions(+), 534 deletions(-)
+  
+
+  $ f -s .hg/store/data/*.d
+  .hg/store/data/_s_p_a_r_s_e-_r_e_v_l_o_g-_t_e_s_t-_f_i_l_e.d: size=74365490
+  $ hg debugrevlog *
+  format : 1
+  flags  : generaldelta
+  
+  revisions     :     5001
+      merges    :      625 (12.50%)
+      normal    :     4376 (87.50%)
+  revisions     :     5001
+      empty     :        0 ( 0.00%)
+                     text  :        0 (100.00%)
+                     delta :        0 (100.00%)
+      snapshot  :      101 ( 2.02%)
+        lvl-0   :            101 ( 2.02%)
+      deltas    :     4900 (97.98%)
+  revision size : 74365490
+      snapshot  : 20307865 (27.31%)
+        lvl-0   :       20307865 (27.31%)
+      deltas    : 54057625 (72.69%)
+  
+  chunks        :     5001
+      0x78 (x)  :     5001 (100.00%)
+  chunks size   : 74365490
+      0x78 (x)  : 74365490 (100.00%)
+  
+  avg chain length  :       23
+  max chain length  :       45
+  max chain reach   : 11039464
+  compression ratio :       23
+  
+  uncompressed data size (min/max/avg) : 346468 / 346472 / 346471
+  full revision size (min/max/avg)     : 200927 / 201202 / 201067
+  inter-snapshot size (min/max/avg)    : 0 / 0 / 0
+  delta size (min/max/avg)             : 10649 / 103898 / 11032
+  
+  deltas against prev  : 4231 (86.35%)
+      where prev = p1  : 4172     (98.61%)
+      where prev = p2  :    0     ( 0.00%)
+      other            :   59     ( 1.39%)
+  deltas against p1    :  651 (13.29%)
+  deltas against p2    :   18 ( 0.37%)
+  deltas against other :    0 ( 0.00%)