浏览代码

prune: Delete all archives in a single transaction

This will improve performance and make the whole operation atomic
Jonas Borgström 11 年之前
父节点
当前提交
839dd94a59
共有 2 个文件被更改,包括 10 次插入6 次删除
  1. 1 4
      attic/archive.py
  2. 9 2
      attic/archiver.py

+ 1 - 4
attic/archive.py

@@ -316,7 +316,7 @@ class Archive:
         elif not symlink:
             os.utime(path, (item[b'mtime'] / 10**9, item[b'mtime'] / 10**9))
 
-    def delete(self, cache):
+    def delete(self):
         unpacker = msgpack.Unpacker(use_list=False)
         for id_, data in zip(self.metadata[b'items'], self.repository.get_many(self.metadata[b'items'])):
             unpacker.feed(self.key.decrypt(id_, data))
@@ -328,9 +328,6 @@ class Archive:
 
         self.cache.chunk_decref(self.id)
         del self.manifest.archives[self.name]
-        self.manifest.write()
-        self.repository.commit()
-        cache.commit()
 
     def stat_attrs(self, st, path):
         item = {

+ 9 - 2
attic/archiver.py

@@ -219,7 +219,10 @@ Type "Yes I am sure" if you understand this and want to continue.\n""")
         manifest, key = Manifest.load(repository)
         cache = Cache(repository, key, manifest)
         archive = Archive(repository, key, manifest, args.archive.archive, cache=cache)
-        archive.delete(cache)
+        archive.delete()
+        manifest.write()
+        repository.commit()
+        cache.commit()
         return self.exit_code
 
     def do_mount(self, args):
@@ -338,7 +341,11 @@ Type "Yes I am sure" if you understand this and want to continue.\n""")
                 self.print_verbose('Would prune:     %s' % format_archive(archive))
             else:
                 self.print_verbose('Pruning archive: %s' % format_archive(archive))
-                archive.delete(cache)
+                archive.delete()
+        if to_delete and not args.dry_run:
+            manifest.write()
+            repository.commit()
+            cache.commit()
         return self.exit_code
 
     helptext = {}