[PATCH 0 of 2 STABLE] Preventing repo corruption on hardlinked clones
Adrian Buehlmann
adrian at cadifra.com
Sun Oct 31 07:32:56 UTC 2010
I recommend to take these two patches for 1.7.
The first patch adapts to the recent changes done in util.opener (a resend
with amended change message).
The second patch is basically a rebase and resend of my hardlink auto
detection patch sent on 2010-10-20. I updated the change message for the
patch and redid my manual testing on Windows and ran the testsuite on Ubuntu.
Recommended debug print patch for those interested (I used this during
development):
diff --git a/mercurial/util.py b/mercurial/util.py
--- a/mercurial/util.py
+++ b/mercurial/util.py
@@ -906,6 +906,9 @@ class opener(object):
if self.linktest:
self.linktest = False
self._forcecopy = not testnlinks(self.base)
+ if self._forcecopy:
+ print "opener(%s):" % (self.base),
+ print "detected hardlink blindness! -> setting _forcecopy"
try:
nlink = nlinks(f)
except OSError:
@@ -913,9 +916,13 @@ class opener(object):
if not os.path.isdir(dirname):
makedirs(dirname, self.createmode)
if atomictemp:
+ print "opener(%s): atomictemp" % (self.base), mode, f
return atomictempfile(f, mode, self.createmode)
if nlink > 1 or self._forcecopy:
+ if self._forcecopy:
+ print "opener(%s): forced COW for" % (self.base), f
rename(mktempcopy(f), f)
+ print "opener(%s):" % (self.base), mode, f
fp = posixfile(f, mode)
if nlink == 0:
self._fixfilemode(f)
Example of a testcase I did on Windows with the above debug print patch applied:
$ hgc qrefresh
--- running hg from C:\Users\adi\hgrepos\hg-crew
opener(Y:\a\.hg\patches): atomictemp wb Y:\a\.hg\patches\3.diff
opener(Y:\a\.hg): wb Y:\a\.hg\journal.dirstate
opener(Y:\a\.hg): wb Y:\a\.hg\journal.branch
opener(Y:\a\.hg): wb Y:\a\.hg\journal.desc
opener(Y:\a\.hg\store): detected hardlink blindness! -> setting _forcecopy
opener(Y:\a\.hg\store): forced COW for Y:\a\.hg\store\00changelog.i
opener(Y:\a\.hg\store): ab Y:\a\.hg\store\00changelog.i
opener(Y:\a\.hg\store): forced COW for Y:\a\.hg\store\00manifest.i
opener(Y:\a\.hg\store): ab Y:\a\.hg\store\00manifest.i
opener(Y:\a\.hg\store): forced COW for Y:\a\.hg\store\data/b.i
opener(Y:\a\.hg\store): ab Y:\a\.hg\store\data/b.i
opener(Y:\a\.hg\store): forced COW for Y:\a\.hg\store\data/c.i
opener(Y:\a\.hg\store): ab Y:\a\.hg\store\data/c.i
opener(Y:\a\.hg): wb Y:\a\.hg\last-message.txt
opener(Y:\a\.hg): wb Y:\a\.hg\journal.dirstate
opener(Y:\a\.hg): wb Y:\a\.hg\journal.branch
opener(Y:\a\.hg): wb Y:\a\.hg\journal.desc
opener(Y:\a\.hg\store): forced COW for Y:\a\.hg\store\data/b.i
opener(Y:\a\.hg\store): a+b Y:\a\.hg\store\data/b.i
opener(Y:\a\.hg\store): forced COW for Y:\a\.hg\store\data/c.i
opener(Y:\a\.hg\store): a+b Y:\a\.hg\store\data/c.i
opener(Y:\a\.hg\store): forced COW for Y:\a\.hg\store\00manifest.i
opener(Y:\a\.hg\store): a+b Y:\a\.hg\store\00manifest.i
opener(Y:\a\.hg\store): forced COW for Y:\a\.hg\store\00changelog.i
opener(Y:\a\.hg\store): a+b Y:\a\.hg\store\00changelog.i
opener(Y:\a\.hg\store): forced COW for Y:\a\.hg\store\00changelog.i
opener(Y:\a\.hg\store): ab Y:\a\.hg\store\00changelog.i
opener(Y:\a\.hg): atomictemp wb Y:\a\.hg\dirstate
opener(Y:\a\.hg\patches): wb Y:\a\.hg\patches\status
More information about the Mercurial-devel
mailing list