2
0
Эх сурвалжийг харах

Merge pull request #2115 from textshell/fix/manifest-timestamp

Manifest: Make sure manifest timestamp is strictly monotonically increasing.
textshell 8 жил өмнө
parent
commit
5479ef469d
1 өөрчлөгдсөн 8 нэмэгдсэн , 1 устгасан
  1. 8 1
      borg/helpers.py

+ 8 - 1
borg/helpers.py

@@ -110,6 +110,7 @@ class Manifest:
         self.repository = repository
         self.repository = repository
         self.item_keys = frozenset(item_keys) if item_keys is not None else ITEM_KEYS
         self.item_keys = frozenset(item_keys) if item_keys is not None else ITEM_KEYS
         self.tam_verified = False
         self.tam_verified = False
+        self.timestamp = None
 
 
     @classmethod
     @classmethod
     def load(cls, repository, key=None, force_tam_not_required=False):
     def load(cls, repository, key=None, force_tam_not_required=False):
@@ -151,7 +152,13 @@ class Manifest:
     def write(self):
     def write(self):
         if self.key.tam_required:
         if self.key.tam_required:
             self.config[b'tam_required'] = True
             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 = {
         m = {
             'version': 1,
             'version': 1,
             'archives': StableDict((name, StableDict(archive)) for name, archive in self.archives.items()),
             'archives': StableDict((name, StableDict(archive)) for name, archive in self.archives.items()),