diff options
| author | Ludovic Courtès <ludo@gnu.org> | 2025-10-17 15:34:03 +0200 |
|---|---|---|
| committer | Ludovic Courtès <ludo@gnu.org> | 2025-11-03 17:18:38 +0100 |
| commit | eb83cceb7eb2774e9d7ff90317ab1d0dcf350f2c (patch) | |
| tree | bfdef445654fb9b36a855d8cad555afe16649d06 | |
| parent | 7d488fec76c8fc36b2d6d058e172fc37f72f9787 (diff) | |
shell: Don’t rely on atime for caching.
Relying on atime was fine even on ‘noatime’ file systems because the atime was
explicitly updated. However, on file systems with atime enabled, cache items
were potentially retained for too long since scanning the cache directory
could update atimes.
* guix/scripts/shell.scm (options-with-caching): In ‘utime’ call, change both
the mtime and the atime.
(guix-shell)[entry-expiration]: Use ‘file-expiration-time’ with ‘stat:mtime’.
Change-Id: Ibe2aedae41a1018a95c2efe7f2dcf08bd1caae2a
| -rw-r--r-- | guix/scripts/shell.scm | 12 |
1 files changed, 4 insertions, 8 deletions
diff --git a/guix/scripts/shell.scm b/guix/scripts/shell.scm index 80251606a32..541c8a3184a 100644 --- a/guix/scripts/shell.scm +++ b/guix/scripts/shell.scm @@ -250,10 +250,8 @@ cache) or a 'gc-root' key (to add the profile to cache)." stat (<= timestamp (stat:mtime stat))) (let ((now (current-time))) - ;; Update the atime on ROOT to reflect usage. - (utime root - now (stat:mtime stat) 0 (stat:mtimensec stat) - AT_SYMLINK_NOFOLLOW) + ;; Update the mtime on ROOT to reflect usage. + (utime root now now 0 0 AT_SYMLINK_NOFOLLOW) (alist-cons 'profile root (remove (match-lambda (('load . _) #t) @@ -566,11 +564,9 @@ concatenates MANIFESTS, a list of expressions." (file (string-append directory "/" file))) (or (scandir directory) '()))) - (define* (entry-expiration file) + (define entry-expiration ;; Return the time at which FILE, a cached profile, is considered expired. - (match (false-if-exception (lstat file)) - (#f 0) ;FILE may have been deleted in the meantime - (st (+ (stat:atime st) (* 60 60 24 7))))) + (file-expiration-time (* 60 60 24 7) stat:mtime)) (define opts (parse-args args)) |
