瀏覽代碼

repo cleanup/write: invalidate cached FDs

(cherry picked from commit 88e134044572445b643f8b6ac7185704baa84a37)
Thomas Waldmann 7 年之前
父節點
當前提交
2798af3232
共有 1 個文件被更改,包括 8 次插入0 次删除
  1. 8 0
      borg/repository.py

+ 8 - 0
borg/repository.py

@@ -631,6 +631,8 @@ class LoggedIO:
         self.segment = transaction_id + 1
         for segment, filename in self.segment_iterator(reverse=True):
             if segment > transaction_id:
+                if segment in self.fds:
+                    del self.fds[segment]
                 os.unlink(filename)
             else:
                 break
@@ -685,6 +687,12 @@ class LoggedIO:
             self._write_fd = open(self.segment_filename(self.segment), 'xb')
             self._write_fd.write(MAGIC)
             self.offset = MAGIC_LEN
+            if self.segment in self.fds:
+                # we may have a cached fd for a segment file we already deleted and
+                # we are writing now a new segment file to same file name. get rid of
+                # of the cached fd that still refers to the old file, so it will later
+                # get repopulated (on demand) with a fd that refers to the new file.
+                del self.fds[self.segment]
         return self._write_fd
 
     def get_fd(self, segment):