[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