# HG changeset patch # User Durham Goode # Date 2014-03-24 22:31:47 # Node ID cd03854a2e060179eae490a00560dca9c5c4eba9 # Parent 09e7118715ebdb515a0b9bf87c00416d6c408842 fncache: remove the rewriting logic The fncache could rewrite itself during a read operation if it noticed any entries that were no longer on disk. This was problematic because it caused Mercurial to perform write operations outside the scope of a lock or transaction, which could interefere with any other pending writes. This will be replaced in a future patch by logic that cleans up the fncache as files are deleted during strips. diff --git a/mercurial/store.py b/mercurial/store.py --- a/mercurial/store.py +++ b/mercurial/store.py @@ -402,20 +402,13 @@ class fncache(object): raise util.Abort(t) fp.close() - def _write(self, files, atomictemp): - fp = self.vfs('fncache', mode='wb', atomictemp=atomictemp) - if files: - fp.write(encodedir('\n'.join(files) + '\n')) - fp.close() - self._dirty = False - - def rewrite(self, files): - self._write(files, False) - self.entries = set(files) - def write(self): if self._dirty: - self._write(self.entries, True) + fp = self.vfs('fncache', mode='wb', atomictemp=True) + if self.entries: + fp.write(encodedir('\n'.join(self.entries) + '\n')) + fp.close() + self._dirty = False def add(self, fn): if self.entries is None: @@ -476,7 +469,6 @@ class fncachestore(basicstore): return self.rawvfs.stat(path).st_size def datafiles(self): - rewrite = False existing = [] for f in sorted(self.fncache): ef = self.encode(f) @@ -486,12 +478,6 @@ class fncachestore(basicstore): except OSError, err: if err.errno != errno.ENOENT: raise - # nonexistent entry - rewrite = True - if rewrite: - # rewrite fncache to remove nonexistent entries - # (may be caused by rollback / strip) - self.fncache.rewrite(existing) def copylist(self): d = ('data dh fncache phaseroots obsstore'