[PATCH 2 of 2] util: move checknlink away from the dependency of a hard-coded filename

Yuya Nishihara yuya at tcha.org
Tue Aug 23 11:28:25 EDT 2016


On Fri, 19 Aug 2016 13:58:40 -0700, ttung at fb.com wrote:
> # HG changeset patch
> # User Tony Tung <tonytung at merly.org>
> # Date 1471639931 25200
> #      Fri Aug 19 13:52:11 2016 -0700
> # Node ID 4aaeb57d5f4497ef35b48e23b80e43b914afd819
> # Parent  2efc5a05d80a6d4253767f2ce0c2fb062ba83cb6
> util: move checknlink away from the dependency of a hard-coded filename

> --- a/mercurial/util.py
> +++ b/mercurial/util.py
> @@ -1305,34 +1305,33 @@
>  def checknlink(testfile):
>      '''check whether hardlink count reporting works properly'''
>  
> +    dirpath, filename = os.path.split(testfile)
> +
>      # testfile may be open, so we need a separate file for checking to
>      # work around issue2543 (or testfile may get lost on Samba shares)
> -    f1 = testfile + ".hgtmp1"
> -    if os.path.lexists(f1):
> -        return False
> +    f1handle, f1path = tempfile.mkstemp(prefix=filename, dir=dirpath)
> +    os.close(f1handle)
> +
> +    f2handle, f2path = tempfile.mkstemp(prefix=filename, dir=dirpath)
> +    os.close(f2handle)
> +    f2handle = None

As you've mentioned in the previous patch, we should delete f1/f2path on error.
Other than that, this series looks good to me.

> +    # there's a small race condition that another file can jam itself in between
> +    # the time we remove f2 and the time we create the hard link.  in the
> +    # unlikely scenario that happens, we'll treat it as nlink being unreliable.
>      try:
[...]
> +        os.unlink(f2path)
> +        oslink(f1path, f2path)

I would use f2path = f1path + '.2' assuming f1path has enough random bits, but
your version, mkstemp+unlink+link, should be more robust for a race condition.


More information about the Mercurial-devel mailing list