]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
fix: Restore atime when recompressor fails to read a file
authorJoel Rosdahl <joel@rosdahl.net>
Sun, 8 Mar 2026 18:00:42 +0000 (19:00 +0100)
committerJoel Rosdahl <joel@rosdahl.net>
Sun, 8 Mar 2026 18:00:42 +0000 (19:00 +0100)
src/ccache/core/filerecompressor.cpp

index 9306f5e98d684f7fea7216036fc7e303b752a1b6..cd5cd6df9a5d5d18fd696d3b2ea776ceab2dc006 100644 (file)
@@ -21,6 +21,7 @@
 #include <ccache/core/atomicfile.hpp>
 #include <ccache/core/cacheentry.hpp>
 #include <ccache/core/exceptions.hpp>
+#include <ccache/util/defer.hpp>
 #include <ccache/util/expected.hpp>
 #include <ccache/util/file.hpp>
 #include <ccache/util/format.hpp>
@@ -42,6 +43,14 @@ FileRecompressor::recompress(const DirEntry& dir_entry,
 
   std::optional<DirEntry> new_dir_entry;
 
+  // Restore mtime/atime to keep cache LRU cleanup working as expected:
+  DEFER([&] {
+    if (keep_atime == KeepAtime::yes || new_dir_entry) {
+      util::set_timestamps(
+        dir_entry.path(), dir_entry.mtime(), dir_entry.atime());
+    }
+  });
+
   if (header.compression_level != wanted_level) {
     const auto cache_file_data = util::value_or_throw<core::Error>(
       util::read_file<util::Bytes>(dir_entry.path()),
@@ -61,12 +70,6 @@ FileRecompressor::recompress(const DirEntry& dir_entry,
     new_dir_entry = DirEntry(dir_entry.path(), DirEntry::LogOnError::yes);
   }
 
-  // Restore mtime/atime to keep cache LRU cleanup working as expected:
-  if (keep_atime == KeepAtime::yes || new_dir_entry) {
-    util::set_timestamps(
-      dir_entry.path(), dir_entry.mtime(), dir_entry.atime());
-  }
-
   m_content_size += util::likely_size_on_disk(header.entry_size);
   m_old_size += dir_entry.size_on_disk();
   m_new_size += new_dir_entry.value_or(dir_entry).size_on_disk();