Преглед на файлове

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.
Martin Hostettler преди 8 години
родител
ревизия
6b8cf0aa8c
променени са 1 файла, в които са добавени 8 реда и са изтрити 1 реда
  1. 8 1
      borg/helpers.py

+ 8 - 1
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()),