Mercurial > hg > mercurial-source
view tests/test-journal-share.t @ 44087:ffd04bc9f57d
copies: move from a copy on branchpoint to a copy on write approach
Before this changes, any branch points results in a copy of the dictionary containing the
copy information. This can be very costly for branchy history with few rename
information. Instead, we take a "copy on write" approach. Copying the input data
only when we are about to update them.
In practice we where already doing the copying in half of these case (because
`_chain` makes a copy), so we don't add a significant cost here even in the
linear case. However the speed up in branchy case is very significant. Here are
some timing on the pypy repository.
revision: large amount; added files: large amount; rename small amount; c3b14617fbd7 9ba6ab77fd29
before: ! wall 1.399863 comb 1.400000 user 1.370000 sys 0.030000 (median of 10)
after: ! wall 0.766453 comb 0.770000 user 0.750000 sys 0.020000 (median of 11)
revision: large amount; added files: small amount; rename small amount; c3b14617fbd7 f650a9b140d2
before: ! wall 1.876748 comb 1.890000 user 1.870000 sys 0.020000 (median of 10)
after: ! wall 1.167223 comb 1.170000 user 1.150000 sys 0.020000 (median of 10)
revision: large amount; added files: large amount; rename large amount; 08ea3258278e d9fa043f30c0
before: ! wall 0.242457 comb 0.240000 user 0.240000 sys 0.000000 (median of 39)
after: ! wall 0.211476 comb 0.210000 user 0.210000 sys 0.000000 (median of 45)
revision: small amount; added files: large amount; rename large amount; df6f7a526b60 a83dc6a2d56f
before: ! wall 0.013193 comb 0.020000 user 0.020000 sys 0.000000 (median of 224)
after: ! wall 0.013290 comb 0.010000 user 0.010000 sys 0.000000 (median of 222)
revision: small amount; added files: large amount; rename small amount; 4aa4e1f8e19a 169138063d63
before: ! wall 0.001673 comb 0.000000 user 0.000000 sys 0.000000 (median of 1000)
after: ! wall 0.001677 comb 0.000000 user 0.000000 sys 0.000000 (median of 1000)
revision: small amount; added files: small amount; rename small amount; 4bc173b045a6 964879152e2e
before: ! wall 0.000119 comb 0.000000 user 0.000000 sys 0.000000 (median of 8023)
after: ! wall 0.000119 comb 0.000000 user 0.000000 sys 0.000000 (median of 7997)
revision: medium amount; added files: large amount; rename medium amount; c95f1ced15f2 2c68e87c3efe
before: ! wall 0.201898 comb 0.210000 user 0.200000 sys 0.010000 (median of 48)
after: ! wall 0.167415 comb 0.170000 user 0.160000 sys 0.010000 (median of 58)
revision: medium amount; added files: medium amount; rename small amount; d343da0c55a8 d7746d32bf9d
before: ! wall 0.036820 comb 0.040000 user 0.040000 sys 0.000000 (median of 100)
after: ! wall 0.035797 comb 0.040000 user 0.040000 sys 0.000000 (median of 100)
The extra cost in the linear case can be reclaimed later with some extra logic.
Differential Revision: https://phab.mercurial-scm.org/D7124
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Tue, 15 Oct 2019 18:23:34 +0200 |
parents | cb70be32f5f7 |
children |
line wrap: on
line source
Journal extension test: tests the share extension support $ cat >> testmocks.py << EOF > # mock out procutil.getuser() and util.makedate() to supply testable values > import os > from mercurial import util > from mercurial.utils import procutil > def mockgetuser(): > return b'foobar' > > def mockmakedate(): > filename = os.path.join(os.environ['TESTTMP'], 'testtime') > try: > with open(filename, 'rb') as timef: > time = float(timef.read()) + 1 > except IOError: > time = 0.0 > with open(filename, 'wb') as timef: > timef.write(str(time)) > return (time, 0) > > procutil.getuser = mockgetuser > util.makedate = mockmakedate > EOF $ cat >> $HGRCPATH << EOF > [extensions] > journal= > share= > testmocks=`pwd`/testmocks.py > [remotenames] > rename.default=remote > EOF $ hg init repo $ cd repo $ hg bookmark bm $ touch file0 $ hg commit -Am file0-added adding file0 $ hg journal --all previous locations of the working copy and bookmarks: 0fd3805711f9 . commit -Am file0-added 0fd3805711f9 bm commit -Am file0-added A shared working copy initially receives the same bookmarks and working copy $ cd .. $ hg share repo shared1 updating working directory 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ cd shared1 $ hg journal --all previous locations of the working copy and bookmarks: 0fd3805711f9 . share repo shared1 unless you explicitly share bookmarks $ cd .. $ hg share --bookmarks repo shared2 updating working directory 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ cd shared2 $ hg journal --all previous locations of the working copy and bookmarks: 0fd3805711f9 . share --bookmarks repo shared2 0fd3805711f9 bm commit -Am file0-added Moving the bookmark in the original repository is only shown in the repository that shares bookmarks $ cd ../repo $ touch file1 $ hg commit -Am file1-added adding file1 $ cd ../shared1 $ hg journal --all previous locations of the working copy and bookmarks: 0fd3805711f9 . share repo shared1 $ cd ../shared2 $ hg journal --all previous locations of the working copy and bookmarks: 4f354088b094 bm commit -Am file1-added 0fd3805711f9 . share --bookmarks repo shared2 0fd3805711f9 bm commit -Am file0-added But working copy changes are always 'local' $ cd ../repo $ hg up 0 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (leaving bookmark bm) $ hg journal --all previous locations of the working copy and bookmarks: 0fd3805711f9 . up 0 4f354088b094 . commit -Am file1-added 4f354088b094 bm commit -Am file1-added 0fd3805711f9 . commit -Am file0-added 0fd3805711f9 bm commit -Am file0-added $ cd ../shared2 $ hg journal --all previous locations of the working copy and bookmarks: 4f354088b094 bm commit -Am file1-added 0fd3805711f9 . share --bookmarks repo shared2 0fd3805711f9 bm commit -Am file0-added $ hg up tip 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg up 0 0 files updated, 0 files merged, 1 files removed, 0 files unresolved $ hg journal previous locations of '.': 0fd3805711f9 up 0 4f354088b094 up tip 0fd3805711f9 share --bookmarks repo shared2 Unsharing works as expected; the journal remains consistent $ cd ../shared1 $ hg unshare $ hg journal --all previous locations of the working copy and bookmarks: 0fd3805711f9 . share repo shared1 $ cd ../shared2 $ hg unshare $ hg journal --all previous locations of the working copy and bookmarks: 0fd3805711f9 . up 0 4f354088b094 . up tip 4f354088b094 bm commit -Am file1-added 0fd3805711f9 . share --bookmarks repo shared2 0fd3805711f9 bm commit -Am file0-added New journal entries in the source repo no longer show up in the other working copies $ cd ../repo $ hg bookmark newbm -r tip $ hg journal newbm previous locations of 'newbm': 4f354088b094 bookmark newbm -r tip $ cd ../shared2 $ hg journal newbm previous locations of 'newbm': no recorded locations This applies for both directions $ hg bookmark shared2bm -r tip $ hg journal shared2bm previous locations of 'shared2bm': 4f354088b094 bookmark shared2bm -r tip $ cd ../repo $ hg journal shared2bm previous locations of 'shared2bm': no recorded locations