Patchwork [3,of,9,V2] vfs: use checkambigatclosing in checkambig=True but atomictemp=False case

login
register
mail settings
Submitter Katsunori FUJIWARA
Date Sept. 22, 2016, 12:59 p.m.
Message ID <012c44bc655e19121818.1474549162@feefifofum>
Download mbox | patch
Permalink /patch/16748/
State Accepted
Headers show

Comments

Katsunori FUJIWARA - Sept. 22, 2016, 12:59 p.m.
# HG changeset patch
# User FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
# Date 1474548717 -32400
#      Thu Sep 22 21:51:57 2016 +0900
# Node ID 012c44bc655e19121818ab0c3e34bf610a6dc1cf
# Parent  6b0eb9c2264b6fe8d4d70dfe15c600058d9f0f41
vfs: use checkambigatclosing in checkambig=True but atomictemp=False case

In Mercurial source tree, opening a file in "a"/"a+" mode like below
doesn't specify atomictemp=True for vfs, and this avoids file stat
ambiguity check by atomictempfile.

  - writing changes out in revlog layer uses "a+" mode
  - truncation in repair.strip() uses "a" mode
  - truncation in transaction._playback() uses "a" mode

If steps below occurs at "the same time in sec", all of mtime, ctime
and size are same between (1) and (3).

  1. append data to revlog-style file (and close transaction)
  2. discard appended data by truncation (strip or rollback)
  3. append same size but different data to revlog-style file again

Therefore, cache validation doesn't work after (3) as expected.

This patch uses checkambigatclosing in checkambig=True but
atomictemp=False case, to check (and get rid of) file stat ambiguity
at closing.

This is a part of ExactCacheValidationPlan.

    https://www.mercurial-scm.org/wiki/ExactCacheValidationPlan

Patch

diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py
--- a/mercurial/scmutil.py
+++ b/mercurial/scmutil.py
@@ -587,6 +587,12 @@  class vfs(abstractvfs):
         if nlink == 0:
             self._fixfilemode(f)
 
+        if checkambig:
+            if mode in ('r', 'rb'):
+                raise error.Abort(_('implementation error: mode %s is not'
+                                    ' valid for checkambig=True') % mode)
+            fp = checkambigatclosing(fp)
+
         if backgroundclose:
             if not self._backgroundfilecloser:
                 raise error.Abort(_('backgroundclose can only be used when a '