[PATCH 3 of 3 V2] pack_dirstate: only invalidate mtime for files written in the last second

Adrian Buehlmann adrian at cadifra.com
Sat Aug 31 16:28:54 CDT 2013


On 2013-08-31 22:14, Siddharth Agarwal wrote:
> # HG changeset patch
> # User Siddharth Agarwal <sid0 at fb.com>
> # Date 1376797729 25200
> #      Sat Aug 17 20:48:49 2013 -0700
> # Node ID d932486c0285a75fcbe322a3028aaa5e1d5b2570
> # Parent  c22d981740c0b6484e437461ade3d7dc9a01aa6b
> pack_dirstate: only invalidate mtime for files written in the last second
> 
> Previously we'd place files written in the last second in the lookup set. This
> can lead to pathological cases where a file always remains in the lookup set if
> it gets modified before the next time status is run.
> 
> With this patch, only the mtime of those files is invalidated. This means that
> if a file's size or mode changes, we can immediately declare it as modified
> without needing to compare file contents.
> 
> diff --git a/mercurial/parsers.c b/mercurial/parsers.c
> --- a/mercurial/parsers.c
> +++ b/mercurial/parsers.c
> @@ -330,7 +330,7 @@
>  			 * this. */
>  			if (PyDict_SetItem(map, k, dirstate_unset) == -1)
>  				goto bail;
> -			mode = 0, size = -1, mtime = -1;
> +			mtime = -1;
>  		}
>  		putbe32(mode, p);
>  		putbe32(size, p + 4);
> diff --git a/mercurial/pure/parsers.py b/mercurial/pure/parsers.py
> --- a/mercurial/pure/parsers.py
> +++ b/mercurial/pure/parsers.py
> @@ -100,11 +100,11 @@
>              # systems with a granularity of 1 sec). This commonly happens
>              # for at least a couple of files on 'update'.
>              # The user could change the file without changing its size
> -            # within the same second. Invalidate the file's stat data in
> +            # within the same second. Invalidate the file's mtime in
>              # dirstate, forcing future 'status' calls to compare the
> -            # contents of the file. This prevents mistakenly treating such
> -            # files as clean.
> -            e = (e[0], 0, -1, -1)   # mark entry as 'unset'
> +            # contents of the file if the size is the same. This prevents
> +            # mistakenly treating such files as clean.
> +            e = (e[0], e[1], e[2], -1)
>              dmap[f] = e
>  
>          if f in copymap:

Clever.

If we won't be able to resolve the time, we only force the mtime value
entry to invalid state. "Problem with time" -> "tweak time only". Elegant.

Patch looks correct to me.


More information about the Mercurial-devel mailing list