From 8b2e7ec68099fc85ac7298d462db14b5f0ee7486 Mon Sep 17 00:00:00 2001 From: Marian Beermann Date: Sat, 3 Dec 2016 00:16:21 +0100 Subject: [PATCH] don't do "bigint" conversion for nanosecond mtime 2**63 nanoseconds are 292 years, so this change is good until 2262. See also https://en.wikipedia.org/wiki/Time_formatting_and_storage_bugs#Year_2262 I expect that we will have plenty of time to revert this commit in time for 2262. timespec := time_t + long, so it's probably only 64 bits on some platforms anyway. --- src/borg/cache.py | 8 ++++---- src/borg/item.pyx | 7 +++---- src/borg/testsuite/item.py | 11 ----------- 3 files changed, 7 insertions(+), 19 deletions(-) diff --git a/src/borg/cache.py b/src/borg/cache.py index e0f77caa8..be1783f8d 100644 --- a/src/borg/cache.py +++ b/src/borg/cache.py @@ -15,7 +15,7 @@ from .hashindex import ChunkIndex, ChunkIndexEntry from .helpers import Location from .helpers import Error from .helpers import get_cache_dir, get_security_dir -from .helpers import decode_dict, int_to_bigint, bigint_to_int, bin_to_hex +from .helpers import bin_to_hex from .helpers import format_file_size from .helpers import yes from .helpers import remove_surrogates @@ -350,7 +350,7 @@ Chunk index: {0.total_unique_chunks:20d} {0.total_chunks:20d}""" # this is to avoid issues with filesystem snapshots and mtime granularity. # Also keep files from older backups that have not reached BORG_FILES_CACHE_TTL yet. entry = FileCacheEntry(*msgpack.unpackb(item)) - if entry.age == 0 and bigint_to_int(entry.mtime) < self._newest_mtime or \ + if entry.age == 0 and entry.mtime < self._newest_mtime or \ entry.age > 0 and entry.age < ttl: msgpack.pack((path_hash, entry), fd) pi.output('Saving cache config') @@ -567,7 +567,7 @@ Chunk index: {0.total_unique_chunks:20d} {0.total_chunks:20d}""" if not entry: return None entry = FileCacheEntry(*msgpack.unpackb(entry)) - if (entry.size == st.st_size and bigint_to_int(entry.mtime) == st.st_mtime_ns and + if (entry.size == st.st_size and entry.mtime == st.st_mtime_ns and (ignore_inode or entry.inode == st.st_ino)): self.files[path_hash] = msgpack.packb(entry._replace(age=0)) return entry.chunk_ids @@ -577,6 +577,6 @@ Chunk index: {0.total_unique_chunks:20d} {0.total_chunks:20d}""" def memorize_file(self, path_hash, st, ids): if not (self.do_files and stat.S_ISREG(st.st_mode)): return - entry = FileCacheEntry(age=0, inode=st.st_ino, size=st.st_size, mtime=int_to_bigint(st.st_mtime_ns), chunk_ids=ids) + entry = FileCacheEntry(age=0, inode=st.st_ino, size=st.st_size, mtime=st.st_mtime_ns, chunk_ids=ids) self.files[path_hash] = msgpack.packb(entry) self._newest_mtime = max(self._newest_mtime or 0, st.st_mtime_ns) diff --git a/src/borg/item.pyx b/src/borg/item.pyx index 755f96be8..802322a87 100644 --- a/src/borg/item.pyx +++ b/src/borg/item.pyx @@ -1,6 +1,5 @@ from .constants import ITEM_KEYS from .helpers import safe_encode, safe_decode -from .helpers import bigint_to_int, int_to_bigint from .helpers import StableDict API_VERSION = 1 @@ -153,9 +152,9 @@ class Item(PropDict): rdev = PropDict._make_property('rdev', int) bsdflags = PropDict._make_property('bsdflags', int) - atime = PropDict._make_property('atime', int, 'bigint', encode=int_to_bigint, decode=bigint_to_int) - ctime = PropDict._make_property('ctime', int, 'bigint', encode=int_to_bigint, decode=bigint_to_int) - mtime = PropDict._make_property('mtime', int, 'bigint', encode=int_to_bigint, decode=bigint_to_int) + atime = PropDict._make_property('atime', int) + ctime = PropDict._make_property('ctime', int) + mtime = PropDict._make_property('mtime', int) hardlink_master = PropDict._make_property('hardlink_master', bool) diff --git a/src/borg/testsuite/item.py b/src/borg/testsuite/item.py index fc60e91df..35934f3ba 100644 --- a/src/borg/testsuite/item.py +++ b/src/borg/testsuite/item.py @@ -77,17 +77,6 @@ def test_item_int_property(): item.mode = "invalid" -def test_item_bigint_property(): - item = Item() - small, big = 42, 2 ** 65 - item.atime = small - assert item.atime == small - assert item.as_dict() == {'atime': small} - item.atime = big - assert item.atime == big - assert item.as_dict() == {'atime': b'\0' * 8 + b'\x02'} - - def test_item_user_group_none(): item = Item() item.user = None