mirror of
https://github.com/borgbackup/borg.git
synced 2025-02-22 06:01:54 +00:00
fuse: don't keep all Archive() instances around
they're only needed inside process_archive, and not needed in general for pending_archives.
This commit is contained in:
parent
879f72f227
commit
ff05895b7e
1 changed files with 12 additions and 14 deletions
|
@ -81,22 +81,18 @@ def __init__(self, key, repository, manifest, args, cached_repo):
|
||||||
def _create_filesystem(self):
|
def _create_filesystem(self):
|
||||||
self._create_dir(parent=1) # first call, create root dir (inode == 1)
|
self._create_dir(parent=1) # first call, create root dir (inode == 1)
|
||||||
if self.args.location.archive:
|
if self.args.location.archive:
|
||||||
archive = Archive(self.repository_uncached, self.key, self.manifest, self.args.location.archive,
|
self.process_archive(self.args.location.archive)
|
||||||
consider_part_files=self.args.consider_part_files)
|
|
||||||
self.process_archive(archive)
|
|
||||||
else:
|
else:
|
||||||
archive_names = (x.name for x in self.manifest.archives.list_considering(self.args))
|
archive_names = (x.name for x in self.manifest.archives.list_considering(self.args))
|
||||||
for name in archive_names:
|
for archive_name in archive_names:
|
||||||
archive = Archive(self.repository_uncached, self.key, self.manifest, name,
|
|
||||||
consider_part_files=self.args.consider_part_files)
|
|
||||||
if self.versions:
|
if self.versions:
|
||||||
# process archives immediately
|
# process archives immediately
|
||||||
self.process_archive(archive)
|
self.process_archive(archive_name)
|
||||||
else:
|
else:
|
||||||
# lazy load archives, create archive placeholder inode
|
# lazy load archives, create archive placeholder inode
|
||||||
archive_inode = self._create_dir(parent=1)
|
archive_inode = self._create_dir(parent=1)
|
||||||
self.contents[1][os.fsencode(name)] = archive_inode
|
self.contents[1][os.fsencode(archive_name)] = archive_inode
|
||||||
self.pending_archives[archive_inode] = archive
|
self.pending_archives[archive_inode] = archive_name
|
||||||
|
|
||||||
def sig_info_handler(self, sig_no, stack):
|
def sig_info_handler(self, sig_no, stack):
|
||||||
logger.debug('fuse: %d inodes, %d synth inodes, %d edges (%s)',
|
logger.debug('fuse: %d inodes, %d synth inodes, %d edges (%s)',
|
||||||
|
@ -155,12 +151,14 @@ def _create_dir(self, parent):
|
||||||
self.parent[ino] = parent
|
self.parent[ino] = parent
|
||||||
return ino
|
return ino
|
||||||
|
|
||||||
def process_archive(self, archive, prefix=[]):
|
def process_archive(self, archive_name, prefix=[]):
|
||||||
"""Build fuse inode hierarchy from archive metadata
|
"""Build fuse inode hierarchy from archive metadata
|
||||||
"""
|
"""
|
||||||
self.file_versions = {} # for versions mode: original path -> version
|
self.file_versions = {} # for versions mode: original path -> version
|
||||||
unpacker = msgpack.Unpacker()
|
|
||||||
t0 = time.perf_counter()
|
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)):
|
for key, chunk in zip(archive.metadata.items, self.repository.get_many(archive.metadata.items)):
|
||||||
data = self.key.decrypt(key, chunk)
|
data = self.key.decrypt(key, chunk)
|
||||||
unpacker.feed(data)
|
unpacker.feed(data)
|
||||||
|
@ -314,9 +312,9 @@ def getxattr(self, inode, name, ctx=None):
|
||||||
|
|
||||||
def _load_pending_archive(self, inode):
|
def _load_pending_archive(self, inode):
|
||||||
# Check if this is an archive we need to load
|
# Check if this is an archive we need to load
|
||||||
archive = self.pending_archives.pop(inode, None)
|
archive_name = self.pending_archives.pop(inode, None)
|
||||||
if archive:
|
if archive_name:
|
||||||
self.process_archive(archive, [os.fsencode(archive.name)])
|
self.process_archive(archive_name, [os.fsencode(archive_name)])
|
||||||
|
|
||||||
def lookup(self, parent_inode, name, ctx=None):
|
def lookup(self, parent_inode, name, ctx=None):
|
||||||
self._load_pending_archive(parent_inode)
|
self._load_pending_archive(parent_inode)
|
||||||
|
|
Loading…
Reference in a new issue