From 6b8cf0aa8c10eb580fd11c4be9337ca7b84dd976 Mon Sep 17 00:00:00 2001 From: Martin Hostettler Date: Mon, 30 Jan 2017 00:12:28 +0100 Subject: [PATCH] Manifest: Make sure manifest timestamp is strictly monotonically increasing. Computer clocks are often not set very accurately set, but borg assumes manifest timestamps are never going back in time. Ensure that this is actually the case. --- borg/helpers.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/borg/helpers.py b/borg/helpers.py index 1972a8987..80eed5000 100644 --- a/borg/helpers.py +++ b/borg/helpers.py @@ -110,6 +110,7 @@ class Manifest: self.repository = repository self.item_keys = frozenset(item_keys) if item_keys is not None else ITEM_KEYS self.tam_verified = False + self.timestamp = None @classmethod def load(cls, repository, key=None, force_tam_not_required=False): @@ -151,7 +152,13 @@ class Manifest: def write(self): if self.key.tam_required: self.config[b'tam_required'] = True - self.timestamp = datetime.utcnow().isoformat() + # self.timestamp needs to be strictly monotonically increasing. Clocks often are not set correctly + if self.timestamp is None: + self.timestamp = datetime.utcnow().isoformat() + else: + prev_ts = datetime.strptime(self.timestamp, "%Y-%m-%dT%H:%M:%S.%f") + incremented = (prev_ts + timedelta(microseconds=1)).isoformat() + self.timestamp = max(incremented, datetime.utcnow().isoformat()) m = { 'version': 1, 'archives': StableDict((name, StableDict(archive)) for name, archive in self.archives.items()),