Marking an object in the sstate cache as in use is done with a plain
touch, which writes the modification time along with the access time.
Every build that merely reads an object therefore makes it look newly
created, so its age can no longer be told from the cache itself.

Refresh only the access time and leave the modification time alone. The
modification time then tells when an object was created, the access time
when it was last used.

Signed-off-by: Michael Haener <[email protected]>
Reviewed-by: Adrian Freihofer <[email protected]>
Reviewed-by: Peter Marko <[email protected]>
---
v2:
- dropped SSTATE_ATIME_UPDATE_AFTER, refreshing only the access time is now
  unconditional
- renamed the helper to sstate_touch_atime()
- reduced the scope to the timestamp fix

 meta/classes-global/sstate.bbclass | 34 +++++++++++++++++-------------
 1 file changed, 19 insertions(+), 15 deletions(-)

diff --git a/meta/classes-global/sstate.bbclass 
b/meta/classes-global/sstate.bbclass
index b2fa93650a..921b83d888 100644
--- a/meta/classes-global/sstate.bbclass
+++ b/meta/classes-global/sstate.bbclass
@@ -699,15 +699,7 @@ def sstate_package(ss, d):
     if not os.path.exists(siginfo):
         bb.siggen.dump_this_task(siginfo, d)
     else:
-        try:
-            os.utime(siginfo, None)
-        except PermissionError:
-            pass
-        except OSError as e:
-            # Handle read-only file systems gracefully
-            import errno
-            if e.errno != errno.EROFS:
-                raise e
+        sstate_touch_atime(siginfo)
 
     return
 
@@ -802,7 +794,10 @@ python sstate_create_and_sign_package () {
     # Best effort touch
     def touch(file):
         try:
-            file.touch()
+            if file.exists():
+                sstate_touch_atime(file)
+            else:
+                file.touch()
         except:
             pass
 
@@ -936,13 +931,22 @@ sstate_unpack_package () {
        # Update both any file and any symlink pointing to the file for sigs as 
well as the file
        for file in ${SSTATE_PKG} ${SSTATE_PKG}.sig ${SSTATE_PKG}.siginfo
        do
-               [ ! -e $file ] || touch $file 2>/dev/null || true
-               [ ! -e $file ] || touch --no-dereference $file 2>/dev/null || 
true
+               [ ! -e $file ] || touch -a $file 2>/dev/null || true
+               [ ! -e $file ] || touch -a --no-dereference $file 2>/dev/null 
|| true
        done
 }
 
 BB_HASHCHECK_FUNCTION = "sstate_checkhashes"
 
+def sstate_touch_atime(path):
+    # Refresh the access time and leave the modification time alone.
+    import time
+    try:
+        stat_info = os.stat(path)
+        os.utime(path, (time.time(), stat_info.st_mtime))
+    except OSError:
+        pass
+
 def sstate_checkhashes(sq_data, d, siginfo=False, currentcount=0, 
summary=True, **kwargs):
     import itertools
 
@@ -978,10 +982,10 @@ def sstate_checkhashes(sq_data, d, siginfo=False, 
currentcount=0, summary=True,
         sstatefile = d.expand("${SSTATE_DIR}/" + getsstatefile(tid, siginfo, 
d))
 
         if os.path.exists(sstatefile):
-            oe.utils.touch(sstatefile)
+            sstate_touch_atime(sstatefile)
             for ext in ['.sig', '.siginfo']:
                 if os.path.exists(sstatefile + ext):
-                    oe.utils.touch(sstatefile + ext)
+                    sstate_touch_atime(sstatefile + ext)
             found.add(tid)
             bb.debug(2, "SState: Found valid sstate file %s" % sstatefile)
         else:
@@ -1223,7 +1227,7 @@ python sstate_eventhandler() {
         if not os.path.exists(siginfo):
             bb.siggen.dump_this_task(siginfo, d)
         else:
-            oe.utils.touch(siginfo)
+            sstate_touch_atime(siginfo)
 }
 
 SSTATE_PRUNE_OBSOLETEWORKDIR ?= "1"
-- 
2.34.1

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#245602): 
https://lists.openembedded.org/g/openembedded-core/message/245602
Mute This Topic: https://lists.openembedded.org/mt/121188981/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to