From 3b80688959a76d5c8a2503d381ccf0a3f2c80ee0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Borgstr=C3=B6m?= Date: Thu, 27 Mar 2014 22:43:06 +0100 Subject: [PATCH] mount: Load archive metadata on demand --- attic/fuse.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/attic/fuse.py b/attic/fuse.py index 51286350e..b5dbfd678 100644 --- a/attic/fuse.py +++ b/attic/fuse.py @@ -25,12 +25,18 @@ class AtticOperations(llfuse.Operations): self.parent = {} self.contents = defaultdict(dict) self.default_dir = {b'mode': 0o40755, b'mtime': int(time.time() * 1e9), b'uid': os.getuid(), b'gid': os.getgid()} + self.pending_archives = {} if archive: self.process_archive(archive) else: + self.parent[1] = self.allocate_inode() + self.items[1] = self.default_dir for archive_name in manifest.archives: - archive = Archive(repository, key, manifest, archive_name) - self.process_archive(archive, [os.fsencode(archive_name)]) + archive_inode = self.allocate_inode() + self.items[archive_inode] = self.default_dir + self.parent[archive_inode] = 1 + self.contents[1][os.fsencode(archive_name)] = archive_inode + self.pending_archives[archive_inode] = Archive(repository, key, manifest, archive_name) def process_archive(self, archive, prefix=[]): """Build fuse inode hierarcy from archive metadata @@ -135,7 +141,14 @@ class AtticOperations(llfuse.Operations): except KeyError: raise llfuse.FUSEError(errno.ENODATA) + 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)]) + def lookup(self, parent_inode, name): + self._load_pending_archive(parent_inode) if name == b'.': inode = parent_inode elif name == b'..': @@ -150,6 +163,7 @@ class AtticOperations(llfuse.Operations): return inode def opendir(self, inode): + self._load_pending_archive(inode) return inode def read(self, fh, offset, size):