浏览代码

fuse: don't keep all Archive() instances around

they're only needed inside process_archive, and not needed in general
for pending_archives.
Marian Beermann 8 年之前
父节点
当前提交
ff05895b7e
共有 1 个文件被更改,包括 12 次插入14 次删除
  1. 12 14
      src/borg/fuse.py

+ 12 - 14
src/borg/fuse.py

@@ -81,22 +81,18 @@ class FuseOperations(llfuse.Operations):
     def _create_filesystem(self):
         self._create_dir(parent=1)  # first call, create root dir (inode == 1)
         if self.args.location.archive:
-            archive = Archive(self.repository_uncached, self.key, self.manifest, self.args.location.archive,
-                              consider_part_files=self.args.consider_part_files)
-            self.process_archive(archive)
+            self.process_archive(self.args.location.archive)
         else:
             archive_names = (x.name for x in self.manifest.archives.list_considering(self.args))
-            for name in archive_names:
-                archive = Archive(self.repository_uncached, self.key, self.manifest, name,
-                                  consider_part_files=self.args.consider_part_files)
+            for archive_name in archive_names:
                 if self.versions:
                     # process archives immediately
-                    self.process_archive(archive)
+                    self.process_archive(archive_name)
                 else:
                     # lazy load archives, create archive placeholder inode
                     archive_inode = self._create_dir(parent=1)
-                    self.contents[1][os.fsencode(name)] = archive_inode
-                    self.pending_archives[archive_inode] = archive
+                    self.contents[1][os.fsencode(archive_name)] = archive_inode
+                    self.pending_archives[archive_inode] = archive_name
 
     def sig_info_handler(self, sig_no, stack):
         logger.debug('fuse: %d inodes, %d synth inodes, %d edges (%s)',
@@ -155,12 +151,14 @@ class FuseOperations(llfuse.Operations):
         self.parent[ino] = parent
         return ino
 
-    def process_archive(self, archive, prefix=[]):
+    def process_archive(self, archive_name, prefix=[]):
         """Build fuse inode hierarchy from archive metadata
         """
         self.file_versions = {}  # for versions mode: original path -> version
-        unpacker = msgpack.Unpacker()
         t0 = time.perf_counter()
+        unpacker = msgpack.Unpacker()
+        archive = Archive(self.repository_uncached, self.key, self.manifest, archive_name,
+                          consider_part_files=self.args.consider_part_files)
         for key, chunk in zip(archive.metadata.items, self.repository.get_many(archive.metadata.items)):
             data = self.key.decrypt(key, chunk)
             unpacker.feed(data)
@@ -314,9 +312,9 @@ class FuseOperations(llfuse.Operations):
 
     def _load_pending_archive(self, inode):
         # Check if this is an archive we need to load
-        archive = self.pending_archives.pop(inode, None)
-        if archive:
-            self.process_archive(archive, [os.fsencode(archive.name)])
+        archive_name = self.pending_archives.pop(inode, None)
+        if archive_name:
+            self.process_archive(archive_name, [os.fsencode(archive_name)])
 
     def lookup(self, parent_inode, name, ctx=None):
         self._load_pending_archive(parent_inode)