From cabcbc58872876fe8ff1ab4416a7d56e3a9f13fd Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Sun, 20 Nov 2016 00:08:33 +0100 Subject: [PATCH] fix determination of newest mtime, fixes #1860 bug: if no files were added/modified, _newest_mtime stayed at its initial 0 value. when saving the files cache, this killed all age 0 entries. Now using None as initial value, so we can spot that circumstance. The 2 ** 63 - 1 value is just so it is MAX_INT on a 64bit platform, for better performance. It can be easily increased when y2262 is coming. --- borg/cache.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/borg/cache.py b/borg/cache.py index 53fdae7ca..2c09d93a3 100644 --- a/borg/cache.py +++ b/borg/cache.py @@ -191,7 +191,7 @@ Chunk index: {0.total_unique_chunks:20d} {0.total_chunks:20d}""" def _read_files(self): self.files = {} - self._newest_mtime = 0 + self._newest_mtime = None logger.debug('Reading files cache ...') with open(os.path.join(self.path, 'files'), 'rb') as fd: u = msgpack.Unpacker(use_list=True) @@ -222,6 +222,9 @@ Chunk index: {0.total_unique_chunks:20d} {0.total_chunks:20d}""" if not self.txn_active: return if self.files is not None: + if self._newest_mtime is None: + # was never set because no files were modified/added + self._newest_mtime = 2 ** 63 - 1 # nanoseconds, good until y2262 ttl = int(os.environ.get('BORG_FILES_CACHE_TTL', 20)) with open(os.path.join(self.path, 'files'), 'wb') as fd: for path_hash, item in self.files.items(): @@ -451,4 +454,4 @@ Chunk index: {0.total_unique_chunks:20d} {0.total_chunks:20d}""" # Entry: Age, inode, size, mtime, chunk ids mtime_ns = st.st_mtime_ns self.files[path_hash] = msgpack.packb((0, st.st_ino, st.st_size, int_to_bigint(mtime_ns), ids)) - self._newest_mtime = max(self._newest_mtime, mtime_ns) + self._newest_mtime = max(self._newest_mtime or 0, mtime_ns)