changeset 48396:c0d88407b7d4

largefile: use the proper "mtime boundary" logic during fixup This will prevent ambiguous cache entry to be used in racy situation. This fix flakiness in test and some real live misbehavior. Differential Revision: https://phab.mercurial-scm.org/D11800
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Tue, 23 Nov 2021 18:13:33 +0100
parents 9ae0353c9f5d
children 8d585aa9becf
files hgext/largefiles/lfutil.py hgext/largefiles/reposetup.py
diffstat 2 files changed, 10 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/largefiles/lfutil.py	Tue Nov 23 18:03:51 2021 +0100
+++ b/hgext/largefiles/lfutil.py	Tue Nov 23 18:13:33 2021 +0100
@@ -261,13 +261,10 @@
             st = wctx[lfile].lstat()
             mode = st.st_mode
             size = st.st_size
-            mtime = timestamp.mtime_of(st)
-            cache_data = (mode, size, mtime)
-            # We should consider using the mtime_boundary
-            # logic here, but largefile never actually had
-            # ambiguity protection before, so this confuse
-            # the tests and need more thinking.
-            lfdirstate.set_clean(lfile, cache_data)
+            mtime = timestamp.reliable_mtime_of(st, mtime_boundary)
+            if mtime is not None:
+                cache_data = (mode, size, mtime)
+                lfdirstate.set_clean(lfile, cache_data)
     return s
 
 
--- a/hgext/largefiles/reposetup.py	Tue Nov 23 18:03:51 2021 +0100
+++ b/hgext/largefiles/reposetup.py	Tue Nov 23 18:13:33 2021 +0100
@@ -228,13 +228,12 @@
                                 s = wctx[lfile].lstat()
                                 mode = s.st_mode
                                 size = s.st_size
-                                mtime = timestamp.mtime_of(s)
-                                cache_data = (mode, size, mtime)
-                                # We should consider using the mtime_boundary
-                                # logic here, but largefile never actually had
-                                # ambiguity protection before, so this confuse
-                                # the tests and need more thinking.
-                                lfdirstate.set_clean(lfile, cache_data)
+                                mtime = timestamp.reliable_mtime_of(
+                                    s, mtime_boundary
+                                )
+                                if mtime is not None:
+                                    cache_data = (mode, size, mtime)
+                                    lfdirstate.set_clean(lfile, cache_data)
                     else:
                         tocheck = unsure + modified + added + clean
                         modified, added, clean = [], [], []